最近在使用权限控制遇到了一些坑,分享一下我的排查思路

大致问题普遍如下:

前端请求接口,页面显示并无权限

部分接口可以访问,少部分接口无权限

新创建的用户无权限

首先我们粗略了解下这个注解

就是在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进行更改。

以上就是我的排错方式,说实话我没怎么使用这个注解,但是项目到手还是得明白哪里出了问题!

 

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐