背景
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()获取为空
3使用@Scheduled定时任务的时候,也是获取不到的
4使用注解@inner(value=false) ,SecurityUtils.getUser()也获取不到用户信息