今天在写前后端分离项目时,用jwt加shiro进行登录权限校验时,@RequireRoles("admin")注解不起作用,记录一下。
前提:数据库里面的user_type代表用户类型 :0普通用户 ;1:专家;2:管理员
1.JwtReam中的内容:
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
//进行权限的认证
String token = (String) principalCollection.getPrimaryPrincipal();
log.info("进入进行权限认证的方法!token为{}", token);
User user = null;
SimpleAuthorizationInfo simpleAuthorizationInfo = new SimpleAuthorizationInfo();
try {
Claims decode = JwtUtils.decode(token);
String email = (String) decode.get("email");
user = userLoginService.getUserInfoByEmail(email);
if (user.getUserType() == 2) {
simpleAuthorizationInfo.addRole("admin");
log.info("为用户添加admin权限");
}
} catch (Exception e) {
log.info("解析token异常!");
// 解析token异常,返回错误信息!
}
log.info("用户类型为{}",user.getUserType());
return simpleAuthorizationInfo;
}
2.controller中的写法
@RestController
@RequestMapping("admin/user/")
@Validated
@Api(tags = "管理员管理用户")
@RequiresRoles(value = "admin",logical = Logical.AND)
public class ManagerUserController {
@Resource
private UserService userService;
@GetMapping("getAllUser")
@ApiOperation(value = "获取所有的用户",response = UserInfo.class)
public Result<PageResult> getAllUser(PageDto pageDto) {
boolean role = SecurityUtils.getSubject().hasRole("admin");
log.info("用户是否有权限:{}",role);
return userService.getAllUser(pageDto);
}
}
3.结论
这里可以看到controller里面加了@RequiresRoles(value = "admin",logical = Logical.AND),用户需要权限才能访问接口,但是并没有生效。看看控制台输出了什么:
: 进入进行权限认证的方法!token为 。。。。。。
: 用户类型为0
: 用户是否有权限:false
说明进入了权限认证的方法doGetAuthorizationInfo(PrincipalCollection principalCollection),并且controller里面的方法判断用户是不是有权限,显示用户并没有权限,但是还是进入了方法,并且执行了方法,获取了数据,
说明@RequiresRoles注解并没有生效
4.解决办法
在ShiroConfig里面加上下面的代码:
//开启对shiro注解的支持
@Bean
public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(SecurityManager securityManager) {
AuthorizationAttributeSourceAdvisor advisor = new AuthorizationAttributeSourceAdvisor();
advisor.setSecurityManager(securityManager);
return advisor;
}
//开启aop注解支持
@Bean
public DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator() {
DefaultAdvisorAutoProxyCreator defaultAAP = new DefaultAdvisorAutoProxyCreator();
defaultAAP.setProxyTargetClass(true);
return defaultAAP;
}
这时用户如果没有权限就会下面的报错:
AuthorizationException
可以在全局异常中捕获,返回信息给前端,这里不再演示。
参考链接:https://www.cnblogs.com/tuifeideyouran/p/7696055.html
参考链接:https://www.cnblogs.com/shiguotao-com/p/10617693.html