要显示当前登录用户的信息,我需要访问用户的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属性?
2条答案
按热度按时间4sup72z81#
感谢您的提问。有几种方法可以显示当前登录用户的信息。
1.关于SecurityContextHolder
SecurityContextHolder是Spring Security存储谁被认证的详细信息的地方。Spring Security不关心SecurityContextHolder是如何填充的。如果它包含一个值,它将用作当前已认证的用户。
字符串
请参考Spring文档。
1.从HttpServletRequest
HttpServletRequest.getUserPrincipal()返回SecurityContextHolder.getContext().getAuthentication()的结果。这意味着它是一个身份验证,在使用基于用户名和密码的身份验证时,它通常是UsernamePasswordAuthenticationToken的示例。如果需要有关用户的其他信息,这可能很有用。
型
请参考Spring文档。
1.使用AuthenticationPrincipal注解
Spring Security提供AuthenticationPrincipalArgumentResolver,它可以自动解析Spring MVC参数的当前Authentication.getPrincipal()。通过使用@EnableWebSecurity,您可以自动将其添加到Spring MVC配置中。
型
请参考Spring文档。
1.从认证
Authentication包含... principal:验证用户。当使用用户名/密码进行身份验证时,这通常是UserDetails的示例。
型
请参考Spring文档。
你也可以参考Baeldung - Retrieve User Information in Spring Security,它也给了你一些关于这个问题的信息。如果上面的链接在将来变得无效,请告诉我。
r1zk6ea12#
字符串