前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Spring Security 实战干货:如何获取当前用户信息

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

作者头像
码农小胖哥
发布2021-06-24 17:52:26
5.7K0
发布2021-06-24 17:52:26
举报

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

SecurityContext

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

代码语言:javascript
复制
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
String currentPrincipalName = authentication.getName();

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

代码语言:javascript
复制
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
if (!(authentication instanceof AnonymousAuthenticationToken)) {
    String currentUserName = authentication.getName();
    return currentUserName;
}else{
    throw RuntimeException("No User")
}

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

Principal

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

代码语言:javascript
复制
@GetMapping("/currentusername")
public String currentUserName(Principal principal) {
        return principal.getName();
}

同理Authentication对象也是可以的:

代码语言:javascript
复制
 @GetMapping("/currentusername")
 public String currentUserName(Authentication authentication) {
        return authentication.getName();
 }

AuthenticationPrincipal

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

代码语言:javascript
复制
@GetMapping("/currentusername")
 public String currentUserName(@AuthenticationPrincipal CustomUser customUser) {
   return customUser.getUsername();
}

更简单点的话:

代码语言:javascript
复制
@GetMapping("/currentusername")
 public String currentUserName(@AuthenticationPrincipal(expression = "username") String username) {
   return username;
}

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

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

代码语言:javascript
复制
@Target({ElementType.PARAMETER, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@AuthenticationPrincipal
public @interface CurrentUser {}

CurrentSecurityContext

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

代码语言:javascript
复制
@GetMapping("/currentusername")
public String currentUserName(@CurrentSecurityContext(expression = "authentication") 
  Authentication authentication) {
        return authentication.getName();
}

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

代码语言:javascript
复制
@GetMapping("/principal")
public String getPrincipal(@CurrentSecurityContext(expression = "authentication.principal") 
  Principal principal) { 
    return principal.getName(); 
}

HttpServletRequest

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

总结

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-05-31,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 码农小胖哥 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • SecurityContext
  • Principal
  • AuthenticationPrincipal
  • CurrentSecurityContext
  • HttpServletRequest
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档