Shiro权限判断异常之命名导致的subject.isPermitted 异常

问题描述:最近对权限系统做了一次更新,重新梳理了所有权限并且通过自定义注解配合AOP扫描拦截所有的异常权限请求,但是梳理完成权限后发现页面上的shiro标签和代码中某些地方的subject.isPermitted(key)  “理应”返回false的地方返回了true.

处理过程:debuge进入源码一直进到

8415fdac75551daf5392545b5972601db96.jpg

其中具体参数:

c33c21d494b5d965b146266920d8b4866fc.jpg

从implies进入WildcardPermission

51c936f6ac8d80d047e856426a3eccbfe35.jpg

发现在这里返回了true,此时刻getParts()为crm:sys (角色拥有的多个权限之一) 而 i的长度代表的元素本身为crm:sys:role(目标权限,既需要判断系统里有没有该权限,有就放行)

这时我明白了一切的问题是由于我们命名产生的!(我们命名的结构中希望拥有子权限的人理所应当的拥有父权限,然而shiro的权限判断中认为命名重叠的两个权限中,短名称的权限是级别更高的权限)

 

 

说下我们的命名:

我们的命名是按照菜单目录结构而来,一级菜单如:  crm:statistic 二级菜单: crm:statistic:source 三级菜单:crm:statistic:source:xxx

我们使用冒号 “:”   其实是shiro权限命名中的关键字符,使用冒号命名的权限会被切割成多个级别放入set<T>中 如: [crm] [statistic] [source]    

 

 

解决方式:

1.重新命名比如将":"替换为“_”,当然判断效率相对于冒号命名效率肯定下降,因为变成了完全匹配。

2.按照从长到短的方式进行命名,命名难度较大。

 

转载于:https://my.oschina.net/fusublog/blog/3045445

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值