目录
Controller层的Method()上方添加了@RequiresPermissions注解,例如:
@RequiresPermissions({"sys:user:add"} )
void testMethod();
该注解要求Subject中必须含有sys:user:add的权限才能执行方法testMethod()。否则抛出异常AuthorizationException,可以方便api的权限控制。那么此注解又是如何运转生效的呢?接下来一起来了解下:
1、配置授权
权限配置表中,授权用户角色对应的api操作权限,我这里配置的是perms字段(权限编码)的值为"sys:user:add",对应权限的名称为"新增”,并把该权限授权给用户;
2、获取权限配置
用户登录后,触发检测用户权限时会调用doGetAuthorizationInfo方法->权限信息认证(包括角色以及权限),是用户访问controller的时候才进行验证,我们会把权限信息缓存到redis中。其中getUserPermissionsSet方法会根据登录用户去获取已经授权的权限编码集合。
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
String username = null;
if (principals != null) {
LoginUser sysUser = (LoginUser) principals.getPrimaryPrincipal();
username = sysUser.getUsername();
}
SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
// 设置用户拥有的权限集合,比如“sys:role:add,sys:user:add”
Set<String> permissionSet = sysUserApi.getUserPermissionsSet(username).getResult();
info.addStringPermissions(permissionSet);
log.info("》》》Shiro权限认证成功");
return info;
}
3、运转
配置完毕后,web在请求带有@RequiresPermissions注解的api接口时,回去校验该用户是否拥有相应的权限编码,有则正常执行请求,无则抛出AuthorizationException异常。
4、自定义处理异常
@ExceptionHandler({UnauthorizedException.class, AuthorizationException.class})
public Result<?> handleAuthorizationException(AuthorizationException e){
log.error(e.getMessage(), e);
return Result.noauth("没有权限,请联系管理员授权");
}
上一篇文章
下一篇文章