Shiro @RequiresPermissions是如何运转的

参考大佬博文:https://blog.csdn.net/medelia/article/details/86692521

最近SpringBoot项目安全策略是采用比较流行的shiro框架,是我做的第一个springBoot项目,也是第一次使用shiro。

废话不多说,框架是公司大佬设计的:

在这里插入图片描述

 在查看日志方法上面加了RequiresPermissions。那么只有当用户拥有这个sys:log:content字符串时才能访问此方法。
那怎么知道用户拥有这个字符串呢?????

自己必须定义一个方法

在这里插入图片描述

继承抽象方法 org.apache.shiro.realm.AuthorizingRealm 实现其抽象类doGetAuthorizationInfo方法即可;这样框架就会取到用户权限列表。。。

然后在org.apache.shiro.realm.AuthorizingRealm

在这里插入图片描述

找到此方法 implies便是shiro权限校验的核心:注意containsAll的学习使用,参考:https://blog.csdn.net/baidu_15113429/article/details/53198625

 在这里插入图片描述

这段代码感觉思维真的不是我能想到的。。。虽然看起来很简单 大家有兴趣可以debug跟跟看。

还有用shiro的话一般会用到它的 登录认证 (Authentication)以及 权限验证(Authorization) 2个单词极其相似。。。 登录认证简称authc 权限验证简称authz.

补充下:由于源码中会对方法上面的@RequiresPermissions("")注解中的权限,包含:的会进行分割,生成set<String>集合,所以在进行containsAll()的时候,如果用户含有a权限没有a:b权限,但被调用的方法上面@RequiresPermissions("a:b")这样的话,就会调到此方法;而我们希望含有a:b权限的才调用此方法。所以不采用:,而是用.的形式写权限唯一编码值。

 if (!part.contains(WILDCARD_TOKEN) && !part.containsAll(otherPart)) {
                    return false;
                }

二:另外补充下or和and的使用:

//符合index:hello权限要求
@RequiresPermissions("index:hello")
 
//必须同时复核index:hello和index:world权限要求
@RequiresPermissions({"index:hello","index:world"})
 
//符合index:hello或index:world权限要求即可
@RequiresPermissions(value={"index:hello","index:world"},logical=Logical.OR)

猜你喜欢

转载自blog.csdn.net/zhangleiyes123/article/details/109044198