我是靠谱客的博主 狂野缘分,最近开发中收集的这篇文章主要介绍Shiro源码分析 -- Subject.isPermitted(permission)已登陆用户判断是否具有某权限,觉得挺不错的,现在分享给大家,希望可以做个参考。
概述
这行代码用来判断已登陆用户是否具有某权限
subject.isPermitted(permission.getPermission());
假设登陆用户已有权限:system
我们需要判断的权限: system:role:add
问题在于,此时shiro会判断用户具有system:role:add权限。
通过单步跟踪找到:
WildcardPermission.implies(Permission p)方法。
在该方法中,shiro将已有的权限变成[system],需要判断的权限变成[system]:[role]:[add]这是一个setpublic boolean implies(Permission p) { // By default only supports comparisons with other WildcardPermissions if (!(p instanceof WildcardPermission)) { return false; } WildcardPermission wp = (WildcardPermission) p; 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 if (getParts().size() - 1 < i) { return true; } else { Set<String> part = getParts().get(i); if (!part.contains(WILDCARD_TOKEN) && !part.containsAll(otherPart)) { return false; } i++; } } // If this permission has more parts than the other parts, only imply it if all of the other parts are wildcards for (; i < getParts().size(); i++) { Set<String> part = getParts().get(i); if (!part.contains(WILDCARD_TOKEN)) { return false; } } return true; }
然后在第一个for中对每个部分进行判断,而问题就在于它判断第一部分([system])成功后,发现已有权限的长度小于待判断权限的长度,然后就默认
你后面的权限全有,直接返回true
// 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 if (getParts().size() - 1 < i) { return true; }
而因为这样,我们在全选功能的时候就可以直接把父菜单的权限分配上,子菜单的就不用写进数据库了。
最后
以上就是狂野缘分为你收集整理的Shiro源码分析 -- Subject.isPermitted(permission)已登陆用户判断是否具有某权限的全部内容,希望文章能够帮你解决Shiro源码分析 -- Subject.isPermitted(permission)已登陆用户判断是否具有某权限所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复