- 42
- 0
现在需求是这样的:
需要维持原来的web的权限控制,实现app端的权限控制,但是app端是需要长时间的session不过期的,而web端是30分钟过期。
请问有什么好的实现方法或demo
- 共 0 条
- 全部回答
-
★清茶ヾ与风☆ 普通会员 1楼
Shiro 是一个 Java 企业级权限控制框架,可以用于构建安全的 Web 应用程序。以下是在兼顾 App端和 Web 端权限控制方面的一些方法:
- Web应用权限控制:
- 在 Web 应用程序中,Shiro 提供了一系列
Role和User属性,用于表示不同的角色和用户。在初始化 Shiro 的WebSecurityBuilder构造器时,你可以根据需要设置RoleManager和UserManager。例如:java SecurityBuilder securityBuilder = new SecurityBuilder() .setAuthorizationManager(new AuthorizationManagerBuilder() .setAuthorizationUrl("/api/auth") .setTokenUrl("/api/token") .setTokenValiditySeconds(3600) .setRememberMeTokenValiditySeconds(3600) ) .setTokenManager(new TokenManagerBuilder() .setTokenStore(new UsernamePasswordTokenStore()) .build()) .setRoleManager(new RoleManagerBuilder() .setRoles("admin", "user") .build()) .setCustomUserDetailsService(new CustomUserService()) .build(); - 在 Web 应用程序的每个页面或方法中,你可以使用
SecurityContextHolder.getContext().getAuthentication()获取当前用户,并通过SecurityContextHolder.getContext().getEffectivePrincipal()获取其角色信息。 -
使用
User和Role实例进行权限检查。例如,你可以在用户登录后检查其角色权限:java SecurityContextHolder.getContext().setAuthentication(new UsernamePasswordAuthenticationToken(username, password, new UsernamePasswordAuthenticationToken<>(new User(), role))); if (User.hasRole("admin")) { // 检查管理员权限 } else if (User.hasRole("user")) { // 检查普通用户权限 } -
App端权限控制:
- 在 App端,你需要创建一个安全模型来存储和管理用户和角色信息。例如,你可以使用 Spring Security 或 Spring Boot 2.x 中的
AuthorizationManager来实现。在初始化AuthorizationManager的setRoleManager方法中,你可以根据需要设置RoleManager对象。例如:java AuthorizationManager authorizationManager = new AuthorizationManagerBuilder() .setAuthorizationUrl("/api/auth") .setTokenUrl("/api/token") .setTokenValiditySeconds(3600) .setRememberMeTokenValiditySeconds(3600) .build() .setRoleManager(new DefaultRoleManagerBuilder() .setRoles("admin", "user") .build()); - 在 App端的每个页面或方法中,你可以使用
SecurityContextHolder.getContext().getAuthentication()获取当前用户,并通过SecurityContextHolder.getContext().getEffectivePrincipal()获取其角色信息。 -
使用
User和Role实例进行权限检查。例如,你可以在用户登录后检查其角色权限:java SecurityContextHolder.getContext().setAuthentication(new UsernamePasswordAuthenticationToken(username, password, new UsernamePasswordAuthenticationToken<>(new User(), role))); if (User.hasRole("admin")) { // 检查管理员权限 } else if (User.hasRole("user")) { // 检查普通用户权限 } -
权限策略:
- 你可以使用 Shiro 提供的
AuthorizationStrategy来定义权限策略,例如根据用户的角色和活动定义权限。例如:java AuthorizationStrategy strategy = new DefaultAuthorizationStrategy() .setRoles("admin", "user") .build(); Application application = new SpringSecurityApplication() .addGlobalSecurityStrategy(strategy) .build(); - 在应用配置文件中,你可以为每个控制器或方法定义一个
@Autowired注解的AuthorizationStrategy实例,使用SecurityContext.current().getAuthentication().getPrincipal()获取当前用户,并使用SecurityContext.current().getEffectivePrincipal()获取其角色信息。例如: ```java @Autowired private AuthorizationStrategy strategy;
@GetMapping("/admin") public String adminPage() { return "admin"; }
@GetMapping("/user") public String userPage() { return "user"; }
@PostMapping("/admin") public String adminPost() { return "adminPost"; }
@PostMapping("/user") public String userPost() { return "userPost"; }
@GetMapping("/login") public String loginPage() { return "login"; }
@PostMapping("/login") public String loginPost() { return "loginPost"; } ```
- 集成其他权限控制框架:
-
如果你已经在使用其他权限控制框架,如 Spring Security 或 Spring Boot 2.x 中的
@EnableAuthorizationGranter注解,你可以将它们集成到 Shiro 中。例如,你可以在AuthorizationBuilder构造器中使用@EnableAuthorizationGranter来启用所有可能的 Granter 实例:java SecurityBuilder securityBuilder = new SecurityBuilder() .setAuthorizationManager(new AuthorizationManagerBuilder() .setAuthorizationUrl("/api/auth") .setTokenUrl("/api/token") .setTokenValiditySeconds(3600) .setRememberMeTokenValiditySeconds(3600) .build()) .setTokenManager(new TokenManagerBuilder() .setTokenStore(new UsernamePasswordTokenStore()) .build()) .setRoleManager(new DefaultRoleManagerBuilder() .setRoles("admin", "user") .build()) .setCustomUserDetailsService(new CustomUserService()) .build() .setEnableAuthorizationGranter(true); -
在应用程序中,你可以使用
SecurityContextHolder.getContext().getAuthentication().getPrincipal()获取当前用户,并使用SecurityContextHolder.getContext().getEffectivePrincipal()获取其角色信息,然后调用SecurityContextHolder.getContext().getGranter().authorize()方法执行权限检查。 -
应用部署和热更新:
-
Shiro 可以在生产环境中自动部署和热更新,以处理权限检查和用户信息同步。在 Shiro 中,你可以使用
@EnableWebSecurity注解和@EnableAuthorizationServer注解来启用 Web 和 Authorization Server,然后在需要时手动更新 Shiro 的配置。例如: ```java @EnableWebSecurity @EnableAuthorizationServer public class WebSecurityConfig extends WebSecurityConfigurerAdapter {@Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .antMatchers("/api/auth", "/api/token", "/api/logout", "/login").permitAll() .antMatchers("/admin/").hasRole("admin") .antMatchers("/user/").hasRole("user") .anyRequest().authenticated() .and() .httpBasic().loginPage("/login") .and() .csrf().disable(); } }
@EnableAuthorizationServer public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter {
@Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .antMatchers("/api/auth", "/api/token", "/api/logout", "/login").permitAll() .antMatchers("/admin/**").hasRole("admin") .antMatchers("/user/**").hasRole("user") .anyRequest().authenticated() .and() .httpBasic().loginPage("/login") .and() .csrf().disable(); }} ```
-
Shiro 部署和热更新完成后,你需要在 Web 应用程序的配置文件中配置 Shiro 的服务器端配置,例如在
application.properties或application.yml文件中,使用spring.security.web.access-control-allow-roles和spring.security.web.access-control-allow-methods属性定义允许的用户角色和允许的方法,以及spring.security.web.access-control-allow-http-methods属性定义允许的 HTTP 方法。 -
集成身份验证框架:
-
如果你的应用程序中需要集成其他身份验证框架,如 Spring Security 或 Spring Boot 2.x 中的
@EnableWebSecurity注解和@EnableAuthorizationServer注解,你可以将它们集成到 Shiro 中。例如,你可以在AuthorizationManager构造器中使用@EnableAuthorizationServer注解和@EnableWebSecurity注解来启用 Web 和 Authorization Server,然后在需要时手动更新 Shiro 的配置。例如: ```java @EnableAuthorizationServer @EnableWebSecurity public class WebSecurityConfig extends WebSecurityConfigurerAdapter {@Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .antMatchers("/api/auth", "/api/token", "/api/logout", "/login").permitAll() .antMatchers("/admin/").hasRole("admin") .antMatchers("/user/").hasRole("user") .anyRequest().authenticated() .and() .httpBasic().loginPage("/login") .and() .csrf().disable(); } }
@EnableAuthorizationServer public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter {
@Override protected void configure(HttpSecurity
- 扫一扫访问手机版
回答动态

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器更新之后。服务器里面有部分玩家要重新创建角色是怎么回事啊?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题函数计算不同地域的是不能用内网吧?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题ARMS可以创建多个应用嘛?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题在ARMS如何申请加入公测呀?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题前端小程序接入这个arms具体是如何接入监控的,这个init方法在哪里进行添加?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器刚到期,是不是就不能再导出存档了呢?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器的游戏版本不兼容 尝试更新怎么解决?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器服务器升级以后 就链接不上了,怎么办?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器转移以后服务器进不去了,怎么解决?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器修改参数后游戏进入不了,是什么情况?预计能赚取 0积分收益
- 回到顶部
- 回到顶部
