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

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

创新互联成都网站建设专业公司,是成都网站开发公司,为服务器租用提供网站建设服务,有成熟的网站定制合作流程,提供网站定制设计服务:原型图制作、网站创意设计、前端HTML5制作、后台程序开发等。成都网站改版热线:028-86922220

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获取当前用户的各种方法,它们的各自场景都略有不同,你可以根据这些罗列选择最适合你的应用场景。

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

当前标题:Spring Security 实战干货:如何获取当前用户信息
文章链接:http://www.csdahua.cn/qtweb/news10/405910.html

网站建设、网络推广公司-快上网,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 快上网