Shiro简介
Apache Shiro是Java的一个安全框架,详细的教程可以看大神的博客
基础配置
参考这篇博客,就不在这里赘述了。
注意事项
- 问题:默认自定义AuthorizingRealm中service缓存不生效
解决方案:增加@Lazy注解,出处 - 问题:多组织机构登陆参数传递,当用户有多组织机构时登陆给予提示,并传递组织机构信息到登陆页面
解决方案:自定义异常,将查询结果放到异常中传递到登陆页面,异常信息会传递到对应的登陆方法中,通过request.getAttribute("shiroLoginFailure")来获取。 - 问题:按钮级权限处理
解决方案:通过给菜单指定资源名称+配置菜单对应的permission 来实现,前端使用shiro:hasPermission="${资源名:权限名}"来控制按钮显示,controler端通过@RequiresPermissions("资源名:权限名")注解来控制访问权限 -
问题:自定义filters不生效,执行顺序异常
解决方案:- 将过滤器的设置提到filterChainDefinitionMap之前,
- 不使用spring托管的模式管理过滤器使用new的方式初始化,spring托管会导致过滤器执行顺序异常
- 其它场景使用spring拦截器实现,而不使用过滤器
Map<String, Filter> filters = shiroFilterFactoryBean.getFilters(); //将自定义 的FormAuthenticationFilter注入shiroFilter中 filters.put("authc", new AuthenticationFilter()); shiroFilterFactoryBean.setFilters(filters); Map<String, String> filterChainDefinitionMap = new LinkedHashMap<String, String>(); filterChainDefinitionMap.put("/logout", "logout"); filterChainDefinitionMap.put("/**", "authc"); shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);