当前位置: 首页 > news >正文

shiro注解不起作用:shiro进行权限校验时,@RequireRoles(“admin“)注解不起作用的解决方法

今天在写前后端分离项目时,用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 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

http://www.lryc.cn/news/423649.html

相关文章:

  • ZABBIX邮件监控发送信息
  • Java核心 - 减少循环次数的必要性及其实现方法
  • 国产麒麟系统下U盘只读文件系统问题
  • STM32-定时器-定时器中断-PWM调光
  • 【学习笔记】用线段树维护区间计数问题
  • 4章11节:用R做数据重塑,数据的特征缩放和特征可视化
  • LVS-NAT + LVS-DR
  • 排序算法——插入排序
  • 重修设计模式-行为型-状态模式
  • 网络安全知识渗透测试
  • 我国卫星互联网产业集群崛起;1000万资金扶持 上海助推产业互联网平台跨越式发展;河南“数据要素×”行动实施方案发布 | 产业互联网观察第179期
  • 《RT-DETR》论文笔记
  • 输出Docker容器的启动命令行脚本
  • Dubbo 快速掌握 这篇就够了
  • 【每日刷题】Day100
  • 网络协议九 应用层 HTTPS
  • 【ArrayList】JDK1.8源码详细注释 以及如何实现线程安全的链表
  • [python]rasterio运行代码警告proj_create_from_database: Cannot find proj.db
  • ThinkPHP5.1.C+CmsEasy-SQL注入
  • Python 绘图进阶之词云图:文本数据的可视化艺术
  • 【Windows】Q-Dir(资源管理器)软件介绍
  • 什么是令牌桶算法?工作原理是什么?使用它有哪些优点和注意事项?
  • C++-类与对象(中上篇)
  • 链表 206.反转链表
  • Ubuntu18.04 配置EtherCAT主站IGH SOEM
  • 航空航天构型管理
  • Visual Studio Code 安装与 C/C++ 语言运行总结
  • Science Robotics 受鳞片启发的可编程机器人结构,可同时进行形状变形和刚度变化
  • SpringBoot 自定义 Starter 实现
  • 「Spring MVC」Session、Cookie