当前位置: 首页 > 科技观察

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

时间:2023-03-17 21:51:38 科技观察

在某些场景下,我们需要获取当前用户给谁呢?如果使用SpringSecurity作为安全框架,可以通过以下方式获取当前用户。无论SecurityContext是有状态Session模式还是流行的JWT模式,都可以通过SecurityContext获取当前用户:Authenticationauthentication=SecurityContextHolder.getContext().getAuthentication();StringcurrentPrincipalName=authentication.getName();当然,这个方法还不够严格,如果接口允许匿名访问,那么很可能返回的是匿名用户,而通过getName是无法直接获取到匿名用户的,所以我们需要将上面的逻辑优化为:Authenticationauthentication=SecurityContextHolder.getContext().getAuthentication();if(!(authenticationinstanceofAnonymousAuthenticationToken)){StringcurrentUserName=authentication.getName();returncurrentUserName;}else{throwRuntimeException("NoUser")}其实这个方法我平时用的最多我喜欢用一个抽象的父控制器来封装当前用户。方法。Principaljava.security.Principal对象也可以获取当前用户信息。在SpringSecurity中,此对象表示为Authentication对象。如果我们在SpringMVC接口中定义Principal对象,也可以获取当前用户:@GetMapping("/currentusername")publicStringcurrentUserName(Principalprincipal){returnprincipal.getName();}同样,Authentication对象也是可以的:@GetMapping("/currentusername")publicStringcurrentUserName(Authenticationauthentication){returnauthentication.getName();}AuthenticationPrincipal很多时候我们自定义用户对象UserDetails,我们可以通过SpringSecurity4.0提供的注解@AuthenticationPrincipal来获取当前用户的自定义UserDetails对象。如果CustomUser是UserDetails的实现,那么我们可以:@GetMapping("/currentusername")publicStringcurrentUserName(@AuthenticationPrincipalCustomUsercustomUser){returncustomUser.getUsername();}更简单:@GetMapping("/currentusername")publicStringcurrentUserName(@AuthenticationPrincipal(expression="username")Stringusername){returnusername;}这需要CustomUser包含一个getUsername方法。甚至我们可以自定义一个注解:@Target({ElementType.PARAMETER,ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)@Documented@AuthenticationPrincipalpublic@interfaceCurrentUser{}CurrentSecurityContextSpringSecurity5提供了一个新的注解@CurrentSecurityContext来获取安全上下文当前用户的,可以:@GetMapping("/currentusername")publicStringcurrentUserName(@CurrentSecurityContext(expression="authentication")Authenticationauthentication){returnauthentication.getName();}当然也可以通过表达式参数声明SpEL表达式获取其他属性,比如获取Principal对象:@GetMapping("/principal")publicStringgetPrincipal(@CurrentSecurityContext(expression="authentication.principal")Principalprincipal){returnprincipal.getName();}HttpServletRequest据说getUserPrincipal()HttpServletRequest的方法也是可以的,不过我没用过。有兴趣的同学可以尝试在SpringSecurity框架中直接通过这个方法获取。小结今天总结了SpringSecurity中获取当前用户的各种方法。他们各自的场景略有不同。您可以根据这些列表选择最适合您的应用场景。本文转载自微信公众号“码农小胖哥”,可通过以下二维码关注。转载本文请联系码农小胖公众号。