shiro @RequiresPermissions 权限控制问题排查
最近在使用权限控制遇到了一些坑,分享一下我的排查思路大致问题普遍如下:前端请求接口,页面显示并无权限部分接口可以访问,少部分接口无权限。
最近在使用权限控制遇到了一些坑,分享一下我的排查思路
大致问题普遍如下:
前端请求接口,页面显示并无权限
部分接口可以访问,少部分接口无权限
新创建的用户无权限
首先我们粗略了解下这个注解
就是在Controller的方法里,加上@RequiresPermissions注解,并写上权限标识。那么,有该权限标识的用户,才能访问到该请求。
@RequiresPermissions("comm:update") @PutMapping("/update") @ApiOperation("更新接口") public Result<EmployeeLoginVO> login(@RequestBody EmployeeLoginDTO employeeLoginDTO, HttpSession session) {
此时登录的用户必须拥有comm:update权限才可以访问这个接口,否则会抛出异常AuthorizationException。(这里可以自定义抛出异常,实现错误提醒)
注意:@RequiresPermissions()内表示权限
确保有一个数据库中对应相应的权限表存在此权限权限配置表中,授权用户角色对应的api操作权限,我这里配置的是perms字段(权限编码)的值为"comm:update",对应权限的名称为"更新”,并把该权限授权给用户;
首先排查的是 @RequiresPermissions注解内部
@Target({ElementType.TYPE, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) public @interface RequiresPermissions { String[ ] value(); Logical logical() default Logical.AND; }
logical 值存在两个:and代表必须匹配所有的 or代表只需要匹配其中一个即可
检查注解的使用是否是因为选成了OR 或者AND出现问题
Retention()是存在时间,持续期:
- RetentionPolicy.SOURCE表示注解仅在源代码中可见,编译后的字节码中不包含该注解。
- RetentionPolicy.CLASS表示注解在源代码和字节码中可见,但在运行时不可见。这是默认的保留策略,如果在@Retention注解中不指定value值,则默认为RetentionPolicy.CLASS。
- (大多使用)RetentionPolicy.RUNTIME表示注解在源代码、字节码和运行时都可见。这种保留策略是最常用的,它允许在运行时通过反射获取并解析注解的信息。 根据需要,我们可以选择适当的保留策略,以便在源代码、编译后的字节码或运行时中使用注解。
检查注解的使用是否是因为选错了SOURCE,CLASS,RUNTIME出现问题
interface{ }是自定义一个注解的写法;
其次排查doGetAuthorizationInfo方法
用户登录后,触发检测用户权限时会调用doGetAuthorizationInfo方法,而这个方法中会进行权限信息认证(包括角色以及权限),是用户访问controller的时候才进行验证,我们会把权限信息缓存到redis中。
注意:此方法来自继承 import org.apache.shiro.realm.AuthorizingRealm后重写的方法
@Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals){ SimpleAuthorizationInfo info = new SimpleAuthorizationInfo(); info.setRoles(xxx1) info.setStringPermissions(xxx2); return info;}
(可以使用Ctrl + Shift + R查找这个方法)
不出意外的大概率能找到setRoles(),setStringPermissions()这两个方法
其中xx1于xx2是list集合,一个用于获取角色表,一个用于获取权限表存储于info对象中
也可以使用addStringPermissions(xx3)方法:xx3是一个set集合
找到对应的地方后,在获取权限和角色的地方打断点
看看info对象的值内StringPermisson中的值是否存在缺失。
记录缺失的权限内容,在数据库中找到对应的权限ID于角色ID进行更改。
以上就是我的排错方式,说实话我没怎么使用这个注解,但是项目到手还是得明白哪里出了问题!
更多推荐
所有评论(0)