博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Shiro权限判断异常之命名导致的subject.isPermitted 异常
阅读量:5971 次
发布时间:2019-06-19

本文共 707 字,大约阅读时间需要 2 分钟。

hot3.png

问题描述:最近对权限系统做了一次更新,重新梳理了所有权限并且通过自定义注解配合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

你可能感兴趣的文章
小型自动化运维--expect脚本之传递函数
查看>>
Nsrp实现juniper防火墙的高可用性【HA】!
查看>>
oracle11g 安装在rhel5.0笔记
查看>>
解决Lync 2013演示PPT提示证书问题的多种方法
查看>>
bootloader功能介绍/时钟初始化设置/串口工作原理/内存工作原理/NandFlash工作原理...
查看>>
C++ 构造函数与析构函数
查看>>
ssh免密码登录
查看>>
Linux下Django环境安装
查看>>
如何在指定的内容中找出指定字符串的个数
查看>>
我的友情链接
查看>>
浅谈如何用We7站群平台打造垂直性政务网站
查看>>
我的友情链接
查看>>
Spring MVC请求处理流程分析
查看>>
Web应用工作原理、动态网页技术
查看>>
EXCEL工作表保护密码破解 宏撤销保护图文教程
查看>>
Catalan数(卡特兰数)
查看>>
.Net Core下使用 RSA
查看>>
python 数据库中文乱码 Excel
查看>>
利用console控制台调试php代码
查看>>
递归算法,如何把list中父子类对象递归成树
查看>>