1、前言

使用shiro框架做权限控制是不错的选择,在使用shiro标签的过程中,是否会遇到一些坑呢。恰好笔者遇到了,再次记录一下。

2、shiro标签坑的描述

标签:

<shiro:haspermission name="你的权限"></shiro:haspermission>

当使用的标签具有层级关系的时候,就有可能掉坑里,并且出不来。

例如:

第一层级权限为:【dealer:clue】,第二层级为:【dealer:clue:add】,这个使用坑就出现了。当你使用【dealer:clue:add】权限,关闭【dealer:clue】权限时,你会发现然并卵。

查了很多资料,有人说shiro标签具有继承关系,其实不是的。是因为shiro框的判断机制引起的。我们来一起看看源码吧。

3、源码追踪

使用shiro标签遇到的坑

标签调用后台的方法:

使用shiro标签遇到的坑

核心方法:

使用shiro标签遇到的坑

使用shiro标签遇到的坑

protected List<Set<String>> getParts() {
    return this.parts;
}

public boolean implies(Permission p) {
    if (!(p instanceof WildcardPermission)) {
	return false;
    } else {
        WildcardPermission wp = (WildcardPermission) p;
        // 将权限标识转化成set集合
        List otherParts = wp.getParts();
        int i = 0;

        for (Iterator part = otherParts.iterator(); part.hasNext(); ++i) {
	    Set otherPart = (Set) part.next();
	    if (this.getParts().size() - 1 < i) {
	        return true;
	    }

	    Set part1 = (Set) this.getParts().get(i);
            // 判断包含关系【dealer:clue:add】与【dealer:clue】
	    if (!part1.contains("*") && !part1.containsAll(otherPart)) {
	    	return false;
	    }
        }

        while (i < this.getParts().size()) {
	    Set arg7 = (Set) this.getParts().get(i);
	    if (!arg7.contains("*")) {
	        return false;
	    }

	    ++i;
        }

        return true;
    }
}

4、总结

综上所述,有层级关系的权限标识就有可能带来使用的误区。

shiro标签的判断方式是通过集合的包含关系判断的,并不是通过字符串的形式。

5、参考文档

https://blog.csdn.net/bubble21/article/details/78829959

相关文章: