Spring Security 实战干货:如何获取当前用户信息

开发 架构
今天总结了如何在Spring Security获取当前用户的各种方法,它们的各自场景都略有不同,你可以根据这些罗列选择最适合你的应用场景。

[[402489]]

在某些场景中我们需要获取当前的用户是谁?如果你使用了Spring Secrity作为安全框架你可以通过以下手段获取当前用户。

SecurityContext

无论是有状态的Session模式还是流行的JWT模式你都可以通过SecurityContext来获取当前的用户:

  1. Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); 
  2. String currentPrincipalName = authentication.getName(); 

当然这种方式是不够严谨的,如果接口允许匿名访问很可能返回一个匿名用户,而匿名用户并不能直接通过getName获取,所以我们需要优化上面的逻辑为:

  1. Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); 
  2. if (!(authentication instanceof AnonymousAuthenticationToken)) { 
  3.     String currentUserName = authentication.getName(); 
  4.     return currentUserName; 
  5. }else
  6.     throw RuntimeException("No User"

其实我平常使用这种方式的最多,我喜欢使用一个抽象的父类控制器来封装获取当前用户的方法。

Principal

java.security.Principal对象也可以获取当前的用户信息,在Spring Security中该对象表现为Authentication对象,如果我们在Spring MVC接口中定义Principal对象也可以获取当前用户:

  1. @GetMapping("/currentusername"
  2. public String currentUserName(Principal principal) { 
  3.         return principal.getName(); 

同理Authentication对象也是可以的:

  1. @GetMapping("/currentusername"
  2. public String currentUserName(Authentication authentication) { 
  3.        return authentication.getName(); 

AuthenticationPrincipal

很多时候我们自定义了用户对象UserDetails, 我们可以通过Spring Security 4.0提供的注解@AuthenticationPrincipal来获取当前用户的自定义UserDetails对象。如果CustomUser是UserDetails的实现,那么我们可以:

  1. @GetMapping("/currentusername"
  2.  public String currentUserName(@AuthenticationPrincipal CustomUser customUser) { 
  3.    return customUser.getUsername(); 

更简单点的话:

  1. @GetMapping("/currentusername"
  2.  public String currentUserName(@AuthenticationPrincipal(expression = "username") String username) { 
  3.    return username; 

这需要CustomUser包含一个getUsername方法。

甚至我们自定义一个注解也是可以的:

  1. @Target({ElementType.PARAMETER, ElementType.TYPE}) 
  2. @Retention(RetentionPolicy.RUNTIME) 
  3. @Documented 
  4. @AuthenticationPrincipal 
  5. public @interface CurrentUser {} 

CurrentSecurityContext

Spring Security 5 提供了一个新的注解@CurrentSecurityContext来获取当前用户的安全上下文,你可以:

  1. @GetMapping("/currentusername"
  2. public String currentUserName(@CurrentSecurityContext(expression = "authentication")  
  3.   Authentication authentication) { 
  4.         return authentication.getName(); 

当然你还可以通过expression参数声明SpEL表达式来获取其它属性,例如获取Principal对象:

  1. @GetMapping("/principal"
  2. public String getPrincipal(@CurrentSecurityContext(expression = "authentication.principal")  
  3.   Principal principal) {  
  4.     return principal.getName();  

HttpServletRequest

据说HttpServletRequest的getUserPrincipal()方法也可以,但是我没有用过,感兴趣的同学可以试试能不能在Spring Security框架中直接通过该方法获取。

总结

今天总结了如何在Spring Security获取当前用户的各种方法,它们的各自场景都略有不同,你可以根据这些罗列选择最适合你的应用场景。

本文转载自微信公众号「码农小胖哥」,可以通过以下二维码关注。转载本文请联系码农小胖哥公众号。

 

责任编辑:武晓燕 来源: 码农小胖哥
相关推荐

2021-04-23 07:33:10

SpringSecurity单元

2021-01-28 09:50:29

分布式对象SharedObjec

2021-04-19 07:33:04

WebSecuritySpringHttpSecurit

2019-11-22 09:40:40

SpringJava编程语言

2022-03-22 08:03:22

Spring动态认证数据库

2017-04-28 11:15:26

大数据用户画像技术

2021-07-06 23:48:45

.NET用户信息

2020-09-16 08:07:54

权限粒度Spring Secu

2021-05-31 10:47:17

SpringSecuritySession

2021-08-05 10:40:37

加密方案Spring

2022-05-19 11:29:14

计时攻击SpringSecurity

2021-12-28 11:13:05

安全认证 Spring Boot

2021-08-29 18:36:57

项目

2009-11-23 17:50:01

PHP时间戳

2022-02-21 23:58:49

Spring过滤器顺序值

2022-08-15 08:42:46

权限控制Spring

2022-08-30 08:36:13

Spring权限控制

2022-08-30 08:43:11

Spring权限控制

2022-08-30 08:55:49

Spring权限控制

2023-04-10 11:41:15

点赞
收藏

51CTO技术栈公众号