我是靠谱客的博主 狂野缘分,最近开发中收集的这篇文章主要介绍Shiro源码分析 -- Subject.isPermitted(permission)已登陆用户判断是否具有某权限,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

这行代码用来判断已登陆用户是否具有某权限

subject.isPermitted(permission.getPermission());
假设登陆用户已有权限:system

我们需要判断的权限:    system:role:add


问题在于,此时shiro会判断用户具有system:role:add权限。

通过单步跟踪找到:

WildcardPermission.implies(Permission p)方法。
    public 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;
    }
在该方法中,shiro将已有的权限变成[system],需要判断的权限变成[system]:[role]:[add]这是一个set
然后在第一个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)已登陆用户判断是否具有某权限所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(45)

评论列表共有 0 条评论

立即
投稿
返回
顶部