有个老项目中 使用 的是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 }