为空"/>
SecurityUtils.getUser()获取为空
背景
1一直以来使用SecurityUtils.getUser()
来获取当前登录用户,没想过为什么可以获取当前登录用户的信息
Object principal = authentication.getPrincipal();if (principal instanceof LoginUser) {return (LoginUser) principal;}
2项目使用oauth2,所有接口都需要登录认证
解决
1pom文件中添加了依赖热部署
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><optional>true</optional> <!-- 这个需要为 true 热部署才有效 --><scope>runtime</scope></dependency
这个依赖是为了当时方便开发使用,能实时热部署就不用每次重启,但是这个依赖有问题,去掉依赖之后SecurityUtils.getUser()获取就不为空了
2排除第一个问题之后,当前接口还是SecurityUtils.getUser()获取为空,这时候进入断点发现执行的是以下代码。
Object principal = authentication.getPrincipal();if (principal instanceof LoginUser) {return (LoginUser) principal;}
也就是说走的是admin微服务的Authentication权限校验,判断是否是LoginUser对象,那什么情况会获取authentication这个有差异呢?
想到了是否对该接口有进行其他的配置,
于是找到了nacos,发现security-》oauth2-》client-》ignore-urls对该接口的进行了ignore-urls配置,也就是忽略该接口,不需要验证登录,就获取authentication的信息跟普通情况有差异,所以SecurityUtils.getUser()获取为空
心得
平常看起来不起眼的偷懒还是别偷懒了,老老实实的按照规范走,前人总结出来的不是没有道理的!如果当初就按照规范在每个controller中编写相应的方法,是不会出现今天的问题的。而配置ignore-urls也是业务需要,绕过Auth的,要培养大局观和每一个微小的习惯!
以上只是个人粗俗的理解,有些诠释的不好,接受批评指正。
更多推荐
SecurityUtils.getUser()获取为空
发布评论