账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    shiro 如何兼顾app端及web的权限控制
    42
    0

    现在需求是这样的:
    需要维持原来的web的权限控制,实现app端的权限控制,但是app端是需要长时间的session不过期的,而web端是30分钟过期。
    请问有什么好的实现方法或demo

    1
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • ★清茶ヾ与风☆ 普通会员 1楼

      Shiro 是一个 Java 企业级权限控制框架,可以用于构建安全的 Web 应用程序。以下是在兼顾 App端和 Web 端权限控制方面的一些方法:

      1. Web应用权限控制
      2. 在 Web 应用程序中,Shiro 提供了一系列 RoleUser 属性,用于表示不同的角色和用户。在初始化 Shiro 的 WebSecurityBuilder 构造器时,你可以根据需要设置 RoleManagerUserManager。例如: 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();
      3. 在 Web 应用程序的每个页面或方法中,你可以使用 SecurityContextHolder.getContext().getAuthentication() 获取当前用户,并通过 SecurityContextHolder.getContext().getEffectivePrincipal() 获取其角色信息。
      4. 使用 UserRole 实例进行权限检查。例如,你可以在用户登录后检查其角色权限: java SecurityContextHolder.getContext().setAuthentication(new UsernamePasswordAuthenticationToken(username, password, new UsernamePasswordAuthenticationToken<>(new User(), role))); if (User.hasRole("admin")) { // 检查管理员权限 } else if (User.hasRole("user")) { // 检查普通用户权限 }

      5. App端权限控制

      6. 在 App端,你需要创建一个安全模型来存储和管理用户和角色信息。例如,你可以使用 Spring Security 或 Spring Boot 2.x 中的 AuthorizationManager 来实现。在初始化 AuthorizationManagersetRoleManager 方法中,你可以根据需要设置 RoleManager 对象。例如: java AuthorizationManager authorizationManager = new AuthorizationManagerBuilder() .setAuthorizationUrl("/api/auth") .setTokenUrl("/api/token") .setTokenValiditySeconds(3600) .setRememberMeTokenValiditySeconds(3600) .build() .setRoleManager(new DefaultRoleManagerBuilder() .setRoles("admin", "user") .build());
      7. 在 App端的每个页面或方法中,你可以使用 SecurityContextHolder.getContext().getAuthentication() 获取当前用户,并通过 SecurityContextHolder.getContext().getEffectivePrincipal() 获取其角色信息。
      8. 使用 UserRole 实例进行权限检查。例如,你可以在用户登录后检查其角色权限: java SecurityContextHolder.getContext().setAuthentication(new UsernamePasswordAuthenticationToken(username, password, new UsernamePasswordAuthenticationToken<>(new User(), role))); if (User.hasRole("admin")) { // 检查管理员权限 } else if (User.hasRole("user")) { // 检查普通用户权限 }

      9. 权限策略

      10. 你可以使用 Shiro 提供的 AuthorizationStrategy 来定义权限策略,例如根据用户的角色和活动定义权限。例如: java AuthorizationStrategy strategy = new DefaultAuthorizationStrategy() .setRoles("admin", "user") .build(); Application application = new SpringSecurityApplication() .addGlobalSecurityStrategy(strategy) .build();
      11. 在应用配置文件中,你可以为每个控制器或方法定义一个 @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"; } ```

      1. 集成其他权限控制框架
      2. 如果你已经在使用其他权限控制框架,如 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);

      3. 在应用程序中,你可以使用 SecurityContextHolder.getContext().getAuthentication().getPrincipal() 获取当前用户,并使用 SecurityContextHolder.getContext().getEffectivePrincipal() 获取其角色信息,然后调用 SecurityContextHolder.getContext().getGranter().authorize() 方法执行权限检查。

      4. 应用部署和热更新

      5. 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.propertiesapplication.yml 文件中,使用 spring.security.web.access-control-allow-rolesspring.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
      
    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部