【问题标题】:Accessing UserDetails object from controller in Spring using Spring security [duplicate]使用 Spring 安全性从 Spring 中的控制器访问 UserDetails 对象
【发布时间】:2018-06-04 07:23:34
【问题描述】:

我想从会话中访问一些用户详细信息。我通过覆盖 loadUserByUsername(String username) 方法来使用 Spring Security 和自定义身份验证。

我正在返回一个用户并希望从 我的控制器中访问它。我尝试了主体对象,但我无法访问我的 ESecurityUser 的 companyId 字段目的。

任何帮助将不胜感激..

@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {

    ESecurityUser user = new ESecurityUser();
    user.setUsername("hello");
    user.setPassword("world");
    user.setCompanyId(199);

    Set<EAuthority> authorities = new HashSet<EAuthority>();
    EAuthority authority = new EAuthority();
    authority.setAuthority("ROLE_ADMIN");
    authorities.add(authority);

    user.setAuthorities(authorities);;

    return user;
}

示例控制器代码

@RequestMapping("")
    public String toPeriodicAdReport(@ModelAttribute("advertFormHelper") AdvertFormHelper advertFormHelper,
            Model model,Principal principal) {

        //What to write here so that i can access to authenticated user`s companyId field..

        return "Test";
    }

【问题讨论】:

  • ESecurityUser 用户 = (ESecurityUser) 主体;
  • @brub 你好,我试过了,但我遇到了一个异常。org.springframework.security.authentication.UsernamePasswordAuthenticationToken cannot be cast to tr.com.simroll.ada.rvm.report.entity.ESecurityUser
  • 这个问题应该被编辑,但有例外。这真的有助于了解幕后发生的事情......

标签: spring spring-mvc spring-security


【解决方案1】:

可以使用注解@AuthenticationPrincipal直接访问ESecurityUser

@RequestMapping("")
public String toPeriodicAdReport(@ModelAttribute("advertFormHelper") AdvertFormHelper advertFormHelper,
        Model model, @AuthenticationPrincipal ESecurityUser principal) {
    principal.getCompanyId();
    return "Test";
}

【讨论】:

    【解决方案2】:

    你已经不远了……

    SpringMVC 机制传递给控制器​​方法的Principal 是标识用户的Authentication 令牌。您必须使用其getDetails() 方法来提取您从loadUserByUsername 返回的ESecurityUser

    你的代码可能变成:

    @RequestMapping("")
        public String toPeriodicAdReport(@ModelAttribute("advertFormHelper") AdvertFormHelper advertFormHelper,
                Model model,Principal principal) {
    
            ESecurityUser user = (ESecurityUser) ((Authentication) principal).getDetails();
    
            // stuff...
            return "Test";
    }
    

    【讨论】:

      【解决方案3】:
      ESecurityUser e = (ESecurityUser)SecurityContextHolder.getContext().getAuthentication().getPrincipal();
      

      这对我有用..

      【讨论】:

        猜你喜欢
        • 2011-09-03
        • 1970-01-01
        • 2018-11-09
        • 1970-01-01
        • 1970-01-01
        • 2015-07-02
        • 2015-10-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多