Java 使用Spring Security时获取当前登录的用户名

Java 使用Spring Security时获取当前登录的用户名,java,spring,spring-boot,spring-mvc,spring-security,Java,Spring,Spring Boot,Spring Mvc,Spring Security,这是一款使用Spring security、Spring MVC、, 现在 当应用程序启动时,我需要以某种方式将当前登录的用户初始化到控制器中 问题是: 如果我试图通过SecurityContextHolder获取当前用户,这是不可能的,因为spring似乎在安全之前初始化控制器,所以我无法在控制器中获取它 我有什么遗漏吗?在当前登录用户登录后获取其身份的另一种方法?您需要的是@AuthenticationPrincipal。 您可以将其注入控制器方法,如下所示: @GetMapping("/"

这是一款使用Spring security、Spring MVC、, 现在 当应用程序启动时,我需要以某种方式将当前登录的用户初始化到控制器中

问题是:

  • 如果我试图通过SecurityContextHolder获取当前用户,这是不可能的,因为spring似乎在安全之前初始化控制器,所以我无法在控制器中获取它

  • 我有什么遗漏吗?在当前登录用户登录后获取其身份的另一种方法?

    您需要的是
    @AuthenticationPrincipal
    。 您可以将其注入控制器方法,如下所示:

    @GetMapping("/")
    public void get(@AuthinticationPrincipal User user){ ... }
    
    这是

    或者,您可以创建自己的注释和自定义参数解析器,并注入任何您想要的内容。

    解决方案1:Principal


    解决方案2:身份验证


    解决方案3:SecurityContextHolder


    登录后调用的控制器方法的request.getUserPrincipal().getName()如何?谢谢,工作得很好!正是我想要的。
        @RequestMapping(value = {"/", ""})
        public String start(Principal principal, Model model) {
               String currentUser = principal.getName();       
               return currentUser;
        }
    
    @RequestMapping(value = {"/", ""})
    public String currentUserName(Authentication authentication) {
            return authentication.getName();
    }
    
    Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal();
    if (principal instanceof UserDetails) {
      String username = ((UserDetails)principal).getUsername();
    } else {
      String username = principal.toString();
    }