关于政协 网站建设,宁波网站建设哪家强,景安网站备案的服务码,内江市住房和城乡建设局网站电话号码今天在写前后端分离项目时#xff0c;用jwt加shiro进行登录权限校验时#xff0c;RequireRoles(admin)注解不起作用#xff0c;记录一下。
前提#xff1a;数据库里面的user_type代表用户类型 #xff1a;0普通用户 #xff1b;1#xff1a;专家#xff1…今天在写前后端分离项目时用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 {Resourceprivate UserService userService;GetMapping(getAllUser)ApiOperation(value 获取所有的用户,response UserInfo.class)public ResultPageResult 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