shiro自定义权限标签的坑
来源:互联网 发布:在淘宝买护肤品靠谱吗 编辑:程序博客网 时间:2024/06/08 18:50
shiro遇到的坑
-项目中使用shiro做登录校验和权限管理,在配置权限时遇到小坑,记录一下。
环境:springboot+freemarker+shiro
场景:后台管理,配置菜单以及按钮权限,分为三个层级,一二级暂时只考虑是否查看权限,第三层级为页面按钮权限,分增删改查。详情看图
问题:一二层级正常,第三层级权限不起作用!
权限标签定义如下:
开始怀疑是数据库没有录入,查看后权限标签与角色已对应,排除。
后面怀疑是页面问题,后面把第三层级标签与第一二层级同一页面,依然不起作用,排除。
后面怀疑是权限标签定义问题,把第三层级标签改为one:page1:data:add,奇迹出现,权限生效。证实权限标签定义出了问题。
问题原因:权限标签定义问题
但是后来想想为什么会出现这种问题,每个标签都是独一无二的,对此我对shiro对于权限标签的校验产生了兴趣,查看源码,一路debug后最终在org.apache.shiro.authz.permission中看到了关键所在,核心代码如下
、、、
//当这个方法返回true时说明有此权限
//这个p是代表当前循环匹配到的权限标签
public boolean implies(Permission p) {
// By default only supports comparisons with other WildcardPermissions
if (!(p instanceof WildcardPermission)) {
return false;
}
WildcardPermission wp = (WildcardPermission) p; //把当前标签转分割成一个set集合(如one:page1:view:add 会分割成[[one], [page1], [view], [add]]) List<Set<String>> otherParts = wp.getParts(); int i = 0; //循环匹配权限标签 for (Set<String> otherPart : otherParts) { // If this permission has less parts than the other permission, everything after the number of parts contained // in this permission is automatically implied, so return true //当全部循环匹配完没有返回false,则返回true,这个getparts()方法是获取当前角色当前循环的权限标签([[one], [page1], [view]]) if (getParts().size() - 1 < i) { return true; } else { Set<String> part = getParts().get(i); /*如果包含有‘*’而且不包含当前分割后的标签则返回false, *当用户可以查看页面,也就是说当前角色拥有one:page1:view标签 *这里【!part.contains(WILDCARD_TOKEN)】返回true,第二个【part.containsAll(otherPart)】one会跟当前标签匹**配one, *也就是说这里全部循环完返回的都是false,所以最后都没true,于是在上面返回了一个true。 if (!part.contains(WILDCARD_TOKEN) && !part.containsAll(otherPart)) { return false; } i++; } }
、、、
总结:通过分析,我们看到了shiro在定义权限标签时,要主意匹配问题,不要存在包含问题,类似aaa 和aaab ,会导致后面标签失效。
阅读全文
0 0
- shiro自定义权限标签的坑
- 自定义标签 + shiro 实现权限细粒度控制
- shiro权限验证标签
- shiro权限验证标签
- shiro权限验证标签
- Shiro权限验证标签
- shiro权限验证标签
- shiro权限验证标签
- shiro权限验证标签
- Shiro权限标签
- shiro权限验证标签
- shiro权限验证标签
- shiro权限验证标签
- Shiro权限验证标签
- shiro权限验证标签
- shiro权限验证标签
- 自定义Shiro标签Tag
- 【Shiro权限管理】16.Shiro标签
- Django框架全面讲解 -- Cookie
- TabLayou 与viewpager的结合
- Java注解Annotation基础
- Chrome 去掉“该网站的安全证书不受信任!”的提示
- 你所了解的KVM有多少类别?
- shiro自定义权限标签的坑
- 技术分享连载(八十九)
- 基于koa2 + mongodb + handlebars 开发博客系统
- 剑指offer 编程题(14):链表倒序
- MQTT协议(1)-简介
- DrawLayout的使用
- Echarts学习 堆叠柱状图 柱子样式颜色及透明度宽度间隔修改
- 背包
- webpack学习