【问题标题】:How to get Principal object in ModelAttribute method如何在 ModelAttribute 方法中获取 Principal 对象
【发布时间】:2019-09-14 14:07:44
【问题描述】:

我正在尝试加载一些应该可用于每个 HTTP 请求的基本用户信息。我读到我可以使用带有@ModelAttribute 方法的@ControllerAdvice 类来做到这一点。例如:

@ControllerAdvice
public class DefaultController{

  @ModelAttribute
  public void load(ModelMap model){


  }

}

但是,我无法访问由 Spring Security 管理的 Principal 对象。我尝试了以下方法:

  @ModelAttribute
  public void load(ModelMap model, @AuthenticationPrincipal CustomUser user){


  }

  @ModelAttribute
  public void load(ModelMap model, Principal user){
  //Cast to CustomUser object

  }

但这两种方法都不起作用。我得到用户对象的空值。我想知道是否有人知道如何在 @ModelAttribute 方法中获取 Principal 对象

【问题讨论】:

    标签: java spring spring-mvc spring-security


    【解决方案1】:

    我刚刚意识到,当第一次访问我的主页时,用户没有经过身份验证,所以无论如何在 spring security 中都不会有用户对象。

    我只需要先检查对象是否为空

    @ModelAttribute
    public void load(ModelMap model, @AuthenticationPrincipal CustomUser user){
    
     if(user != null){
        long userId = user.getId();
        //Query database with userId and add data to model
     }
    
    }
    

    【讨论】:

      【解决方案2】:

      您可以使用org.springframework.security.core.context.SecurityContextHolder 获取Authentication 对象

      @ModelAttribute
      public void addUserToModel(Model model) {
          try {
              Authentication auth = SecurityContextHolder.getContext().getAuthentication();
              String username = auth.getName();
              // do something
          } catch (Exception ex) {
      
          }
      }
      

      事实上,您可以在应用程序的任何位置使用SecurityContextHolder

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-02-03
        • 2011-08-16
        • 2018-03-20
        • 2013-03-18
        • 1970-01-01
        • 1970-01-01
        • 2012-12-03
        • 2011-10-14
        相关资源
        最近更新 更多