米德

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

有个老项目中 使用 的是spring boot + shiro的权限框架

由于是后台管理项目,访问量也不大

权限过滤器是直接使用官方原生的roles过滤器。

现在新项目中,权限的设计要复杂一些,roles过滤器已经很难满足需求

所以最近看了一下 roles的权限判断如何重写

在此处记录一下

 1 import java.io.IOException;
 2 import javax.servlet.ServletRequest;
 3 import javax.servlet.ServletResponse;
 4 
 5 import org.apache.shiro.web.filter.authz.RolesAuthorizationFilter;
 6 
 7 /**
 8 *  重写roles的过滤器
 9 * */
10 /*过滤器运行机制:
11 (1)shiro是否拦截访问 以 isAccessAllowed返回值为准
12 (2)如果isAccessAllowed 方法返回false会进入onAccessDenied方法重定向至 登录 or 无权限 页面*/
13 public class MyRolesAuthorizationFilter extends RolesAuthorizationFilter {
14 
15     @Override
16     public boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue)
17             throws IOException {
18         /* 此处可以重写权限判定规则 */
19         boolean allowed =super.isAccessAllowed(request, response, mappedValue);
20 
21         return allowed;
22     }
23 
24     @Override
25     protected boolean onAccessDenied(ServletRequest request, ServletResponse response) throws IOException {
26         /* 此处可以重写权限判断false后的处理 */
27         return super.onAccessDenied(request, response);
28     }
29 
30 
31 }

这是重写的过滤器 具体的判断代码省略 将super的函数替代

然后在shiro配置中加载该过滤器即可

 1   @Bean
 2     public ShiroFilterFactoryBean shiroFilter(SecurityManager securityManager) {
 3 
 4         ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
 5         shiroFilterFactoryBean.setSecurityManager(securityManager);
 6 
 7         /* 自定义filter注册 */
 8         Map<String, Filter> filters = shiroFilterFactoryBean.getFilters();
 9         filters.put("roles", new MyRolesAuthorizationFilter());
10         
11         //拦截器
12         Map<String,String> filterChainDefinitionMap = new LinkedHashMap<String,String>();
13         //<!-- 过滤链定义,从上向下顺序执行,一般将/**放在最为下边
14         //配置退出 过滤器,其中的具体的退出代码Shiro已经替我们实现了
15         filterChainDefinitionMap.put("/logout", "logout");
16         // 配置不会被拦截的链接 顺序判断
17         // 静态文件
18         filterChainDefinitionMap.put("/assets/**", "anon");
19 
20         //不需要拦截的url
21         filterChainDefinitionMap.put("/sys/login", "anon");
22 
23         filterChainDefinitionMap.put("/sys/jumpTest", "roles[1]");
24         
25         //<!-- authc:所有url都必须认证通过才可以访问; anon:所有url都都可以匿名访问-->
26         filterChainDefinitionMap.put("/**", "authc");
27         //配置shiro默认登录界面地址,前后端分离中登录界面跳转应由前端路由控制,后台仅返回json数据
28         // 如果不设置默认会自动寻找Web工程根目录下的"/login.jsp"页面
29         shiroFilterFactoryBean.setLoginUrl("/sys/jumpIn");
30         // 登录成功后要跳转的链接
31         shiroFilterFactoryBean.setSuccessUrl("/sys/jumpIndex");
32         //未授权界面;
33         shiroFilterFactoryBean.setUnauthorizedUrl("/sys/errorPage403");
34         shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
35         return shiroFilterFactoryBean;
36     }

 

 

posted on 2019-12-05 14:24  米德  阅读(803)  评论(0编辑  收藏  举报