简单shiro扩展实现NOT、AND、OR权限验证

转自:http://jinnianshilongnian.iteye.com/blog/1864800

使用过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,并修改:

 

Java代码   收藏代码
  1. private static final String OR_OPERATOR = " or ";  
  2. private static final String AND_OPERATOR = " and ";  
  3. private static final String NOT_OPERATOR = "not ";  
  4. /** 
  5.  * 支持or and not 关键词  不支持and or混用 
  6.  * @param principals 
  7.  * @param permission 
  8.  * @return 
  9.  */  
  10. public boolean isPermitted(PrincipalCollection principals, String permission) {  
  11.     if(permission.contains(OR_OPERATOR)) {  
  12.         String[] permissions = permission.split(OR_OPERATOR);  
  13.         for(String orPermission : permissions) {  
  14.             if(isPermittedWithNotOperator(principals, orPermission)) {  
  15.                 return true;  
  16.             }  
  17.         }  
  18.         return false;  
  19.     } else if(permission.contains(AND_OPERATOR)) {  
  20.         String[] permissions = permission.split(AND_OPERATOR);  
  21.         for(String orPermission : permissions) {  
  22.             if(!isPermittedWithNotOperator(principals, orPermission)) {  
  23.                 return false;  
  24.             }  
  25.         }  
  26.         return true;  
  27.     } else {  
  28.         return isPermittedWithNotOperator(principals, permission);  
  29.     }  
  30. }  
  31.   
  32. private boolean isPermittedWithNotOperator(PrincipalCollection principals, String permission) {  
  33.     if(permission.startsWith(NOT_OPERATOR)) {  
  34.         return !super.isPermitted(principals, permission.substring(NOT_OPERATOR.length()));  
  35.     } else {  
  36.         return super.isPermitted(principals, permission);  
  37.     }  
  38. }  

 

如上代码即可以实现简单的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总起来说使用起来还是比较舒服的,就是更新太慢。。。。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值