书接上文,我们刚实现了一个简单的登录功能,那么我们要如何才能拿到登录用户的具体信息呢?我进行了一下整理
“登录用户的信息” 是保存在 SecurityContext 里的,可以通过多种方式获取这个用户的信息,下面是最常用的方式:
在 Controller 里用 @AuthenticationPrincipal
@GetMapping("/me")
public String getCurrentUser(@AuthenticationPrincipal UserDetails userDetails) {
return "当前登录用户:" + userDetails.getUsername();
}
这个方式适用于:你使用了 Spring Security 默认的 UserDetailsService 或者自定义了用户实体实现了 UserDetails 接口。
SecurityContextHolder.getContext().getAuthentication()
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
Object principal = authentication.getPrincipal();
if (principal instanceof UserDetails userDetails) {
System.out.println("用户名:" + userDetails.getUsername());
}
这个是 最底层、最万能的方式,可以在任何地方(包括 Service 层)使用。
用 Spring 注入 Principal 对象(Controller 中)
@GetMapping("/me")
public String getCurrentUser(Principal principal) {
return "当前登录用户:" + principal.getName();
}
同样的,这个方式也适用于:你使用了 Spring Security 默认的 UserDetailsService 或者自定义了用户实体实现了 UserDetails 接口。
用 HttpServletRequest.getUserPrincipal()
@GetMapping("/me")
public String getUser(HttpServletRequest request) {
Principal principal = request.getUserPrincipal();
return principal.getName();
}
这个也常见于过滤器或 Servlet 场景。
自定义实现UserDetails接口
假设我们已经有了一个实体类TUser,如下:
package org.pp.springsecurity.entity;
import com.baomidou.mybatisplus.annotation


27万+

被折叠的 条评论
为什么被折叠?



