使用过shiro的朋友应该都知道在要想实现any permission的验证是比较麻烦。
很多朋友刚开始接触时以为如<shiro:hasPermission name="showcase:tree:*"> 代表验证拥有任何权限,但这是错误的。如果我们把showcase:tree:*授权给用户,那么此时表示用户具有showcase:tree资源的任意权限,如<shiro:hasPermission name="showcase:tree:*">或shiro:hasPermission name="showcase:tree:create">都能验证成功。
还有朋友认为<shiro:hasPermission name="showcase:tree:create,update"> 是或的关系,也不是,默认是且的关系。
下载了最新的shiro1.3.0-SNAPSHOT 发现并没有增加新的标签或其他支持。
因此我们需要简单的扩展下shiro来支持像spring security 3那样的@Secured支持表达式的强大注解。
不过有人已经提交了一个基于ANTLR实现的@Secured,可以在其JIRA上找到,在其官网的[ Version 2 Brainstorming ]也介绍并探讨了使用ANTLR语法的@Secured注解,可能在为了shiro 2版本添加进去,估计还得大半年,现在是1.3.0-SNAPSHOT。
对于我而言暂时不需要那么复杂的。因此暂时考虑扩展下默认的实现,在不添加任何注解/标签的基础上,简单的支持NOT、AND、OR即可。因此我们扩展AuthorizingRealm,并修改:
private static final String OR_OPERATOR = " or "; private static final String AND_OPERATOR = " and "; private static final String NOT_OPERATOR = "not "; /** * 支持or and not 关键词 不支持and or混用 * @param principals * @param permission * @return */ public boolean isPermitted(PrincipalCollection principals, String permission) { if(permission.contains(OR_OPERATOR)) { String[] permissions = permission.split(OR_OPERATOR); for(String orPermission : permissions) { if(isPermittedWithNotOperator(principals, orPermission)) { return true; } } return false; } else if(permission.contains(AND_OPERATOR)) { String[] permissions = permission.split(AND_OPERATOR); for(String orPermission : permissions) { if(!isPermittedWithNotOperator(principals, orPermission)) { return false; } } return true; } else { return isPermittedWithNotOperator(principals, permission); } } private boolean isPermittedWithNotOperator(PrincipalCollection principals, String permission) { if(permission.startsWith(NOT_OPERATOR)) { return !super.isPermitted(principals, permission.substring(NOT_OPERATOR.length())); } else { return super.isPermitted(principals, permission); } }
如上代码即可以实现简单的NOT、AND、OR支持,不过缺点是不支持复杂的如AND、OR组合。
这样我就可以像如下使用了,不需要额外的标签,就是太长,如果实现如showcase:tree:(create|update|delete)这种语法相对而言简单多了,希望未来官网支持更好的方式:
<shiro:hasPermission name="showcase:tree:create or showcase:tree:update or showcase:tree:delete">
shiro总起来说使用起来还是比较舒服的,就是更新太慢。。。。
相关推荐
SpringBoot整合Shiro示例实现动态权限加载更新+Session共享+单点登录 SpringBoot整合Shiro示例实现动态权限加载更新+Session共享+单点登录 SpringBoot整合Shiro示例实现动态权限加载更新+Session共享+单点登录 ...
vue+shiro实现前端细颗粒按钮级权限,并且可以实现删除和禁用两种不同模式,里面需要的前置技术包括 :vue\vue的自定义指令\vue的自定义插件\vuex
SpringBoot 整合 Shiro,实现从数据库加载权限、权限的动态更新、Session共享。
springMVC+shiro实现动态权限验证,实现动态设置用户角色,根据角色来决定哪些url可以访问 抱歉了各位需要修改下配置文件(org.eclipse.wst.common.component) <?xml version="1.0" encoding="UTF-8"?> ...
SpringBoot ,Shiro 密码加密,登录验证,权限控制demo
SpringBoot整合Shiro,实现从数据库加载权限、权限的动态更新、Session共享
分布式架构实现,基于springboot的shiro权限验证源码,包括redis,activeMq以及邮件通知等,websocket通信,mybatis链接数据库,完整的权限验证架构。
实现shiro的搭建,实现登陆授权以及增删改查的权限验证功能
本文小编将基于 SpringBoot 集成 Shiro 实现动态uri权限,由前端vue在页面配置uri,Java后端动态刷新权
Springboot+Shiro+Redis实现RBAC用户权限管理,其中采用org.creazycake的插件将Redis整合到Shiro中管理
spring boot+shiro 权限认证管理案例 shiro搭配缓存处理
shiro权限demo
从实例入手学习Shiro自定义Realm实现查询数据进行验证示例代码.zip
SSM+Shiro+redis实现的权限系统 Shiro + SpringMvc + Mybatis + Redis 的Demo
ssm整合shiro实现用户权限验证的增删改查实例demo.zip
Spring Boot+Maven+Spring Data JPA+apache Shiro+Easyui实现通用用户权限管理系统
SSM+Shiro实现权限角色控制,+Maven+Tomcat+Mysql,项目可直接在eclipse上跑,数据库表也附件在压缩包中。
Shiro根据用户权限显示不同的菜单.Shiro根据权限显示指定菜单
shiro动态URL权限控制 用过Spring Security的朋友应该比较熟悉对URL进行全局的权限控制,即访问URL时进行权限匹配;如果没有权限直接跳到相应的错误页面。Shiro也支持类似的机制,不过需要稍微改造下来满足实际需求...