java springSecurity.userAccountDetails中的字段

monwx1rj  于 11个月前  发布在  Java
关注(0)|答案(2)|浏览(93)

要显示当前登录用户的信息,我需要访问用户的ID,因为用户名不是唯一的。我从getPrincipal()获得的用户详细信息已经包含一个“id”字段,但我无法使用此方法访问它(抛出NoSuchFieldException)。

@GetMapping("/account")
    String account(Model model){
        Authentication auth = SecurityContextHolder.getContext().getAuthentication();
        String userName= auth.getName();
        Object Principal = auth.getPrincipal();
        UUID id = Principal.getClass().getField("id");

字符串
在控制台中打印的结构看起来像这样:SpringSecurityAuthenticationManagement.UserAccountDetails(id=...,username=...,password=...,isEnabled=...,authorities=...)。如何才能只访问ID属性?

4sup72z8

4sup72z81#

感谢您的提问。有几种方法可以显示当前登录用户的信息。
1.关于SecurityContextHolder
SecurityContextHolder是Spring Security存储谁被认证的详细信息的地方。Spring Security不关心SecurityContextHolder是如何填充的。如果它包含一个值,它将用作当前已认证的用户。

@GetMapping("/account/your-custom-path-0")
public String getAccountIdFromSecurityContextHolder() {
    Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
    UserAccountDetails userAccountDetails = (UserAccountDetails) authentication.getPrincipal();
    UUID uuid = userAccountDetails.getId();
    return uuid.toString();
}

字符串
请参考Spring文档。
1.从HttpServletRequest
HttpServletRequest.getUserPrincipal()返回SecurityContextHolder.getContext().getAuthentication()的结果。这意味着它是一个身份验证,在使用基于用户名和密码的身份验证时,它通常是UsernamePasswordAuthenticationToken的示例。如果需要有关用户的其他信息,这可能很有用。

@GetMapping("/account/your-custom-path-1")
public String getAccountIdFromHttpServletRequest(HttpServletRequest httpServletRequest) {
    UserAccountDetails userAccountDetails = (UserAccountDetails) httpServletRequest.getUserPrincipal();
    UUID uuid = userAccountDetails.getId();
    return uuid.toString();
}


请参考Spring文档。
1.使用AuthenticationPrincipal注解
Spring Security提供AuthenticationPrincipalArgumentResolver,它可以自动解析Spring MVC参数的当前Authentication.getPrincipal()。通过使用@EnableWebSecurity,您可以自动将其添加到Spring MVC配置中。

@GetMapping("/account/your-custom-path-2")
public String getAccountIdUsingAuthenticationPrincipalAnnotation(@AuthenticationPrincipal UserDetails userDetails) {
    UserAccountDetails userAccountDetails = (UserAccountDetails) userDetails;
    UUID uuid = userAccountDetails.getId();
    return uuid.toString();
}


请参考Spring文档。
1.从认证
Authentication包含... principal:验证用户。当使用用户名/密码进行身份验证时,这通常是UserDetails的示例。

@GetMapping("/account/your-custom-path-3")
public String getAccountIdFromAuthentication(Authentication authentication) {
    UserAccountDetails userAccountDetails = (UserAccountDetails) authentication.getPrincipal();
    UUID uuid = userAccountDetails.getId();
    return uuid.toString();
}


请参考Spring文档。
你也可以参考Baeldung - Retrieve User Information in Spring Security,它也给了你一些关于这个问题的信息。如果上面的链接在将来变得无效,请告诉我。

r1zk6ea1

r1zk6ea12#

UserAccountDetails userAccountDetails = (UserAccountDetails) auth.getPrincipal();
UUID id = userAccountDetails.getId()

字符串

相关问题