zoukankan      html  css  js  c++  java
  • (转)SpringBoot shiro添加多角色or关系权限管理

    使用shiro时遇到一个问题,想为多个角色分配同一权限,也就是只要满足其中一个角色,就可以获得该权限,多角色之间是or关系而非and,但是shiro自带的方法同一权限只能分配一个角色。

    1 // 使用如下Shiro自带的方法实现多角色权限分配,无法实现
    2 filterChainDefinitionMap.put("/user/**", "roles[admin]");
    3 filterChainDefinitionMap.put("/user/**", "roles[user]");
    4 
    5 // 理想中的为多角色分配权限方法
    6 filterChainDefinitionMap.put("/behindIndexPage","roles[admin,user]");

    使用Shiro自带的方法,由于是map结构,下面的roles[user]肯定会覆盖roles[admin],所以使用自带方法,只能为一个权限分配一个角色。于是搜寻了一下理想中的分配多角色权限的解决方案,方便日后再用。

    首先,需要重写Shiro自带角色权限过滤器

     1 public class  RoleFilter extends RolesAuthorizationFilter {
     2     @Override
     3     public boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue)
     4             throws IOException {
     5 
     6         final Subject subject = getSubject(request, response);
     7         final String[] rolesArray = (String[]) mappedValue;
     8 
     9         if (rolesArray == null || rolesArray.length == 0) {
    10             // 无指定角色时,无需检查,允许访问
    11             return true;
    12         }
    13 
    14         for (String roleName : rolesArray) {
    15             if (subject.hasRole(roleName)) {
    16                 return true;
    17             }
    18         }
    19 
    20         return false;
    21     }
    22

    然后,只需在Shiro配置类中将刚刚写的自定义过滤器配置进去即可。

     1 @Configuration
     2 public class ShiroConfig {
     3     @Bean
     4     public ShiroFilterFactoryBean shiroFilter(SecurityManager securityManager) {
     5         ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
     6         shiroFilterFactoryBean.setSecurityManager(securityManager);
     7         // 存放自定义的filter,这里导入的是:javax.servlet.Filter
     8         LinkedHashMap<String, Filter> filtersMap = new LinkedHashMap<>();
     9         // 配置自定义 or角色 认证
    10         filtersMap.put("roles", new RoleFilter());
    11         shiroFilterFactoryBean.setFilters(filtersMap);
    12         Map<String, String> filterChainDefinitionMap = new LinkedHashMap<>();
    13         filterChainDefinitionMap.put("/index","roles[admin,user]");
    14         shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
    15         return shiroFilterFactoryBean;
    16 
    17 18
  • 相关阅读:
    Algebra, Topology, Differential Calculus, and Optimization Theory For Computer Science and Machine Learning 第8章 读书笔记(待更新)
    Webpack 2 视频教程 007
    Hie with the Pie
    P4550 收集邮票
    Bloodsucker
    P2627 [USACO11OPEN]Mowing the Lawn G
    SP1026 FAVDICE
    HDU4405 Aeroplane chess
    Card Collector
    LOOPS(概率dp)
  • 原文地址:https://www.cnblogs.com/front-end-develop/p/13199124.html
Copyright © 2011-2022 走看看