使用Spring安全性从Spring中的控制器访问UserDetails对象[复制]

问题描述 投票:-1回答:3

这个问题在这里已有答案:

我想从会话中访问一些用户详细信息。我通过重写loadUserByUsername(String username)方法使用spring安全性和自定义身份验证。

我正在返回一个用户,并希望从我的控制器中访问它。我尝试了主要对象,但我无法访问我的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";
    }
spring spring-mvc spring-security
3个回答
1
投票

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

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

1
投票

你不远......

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

您的代码可能变为:

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

        ESecurityUser user = (ESecurityUser) ((Authentication) principal).getDetails();

        // stuff...
        return "Test";
}

0
投票
ESecurityUser e = (ESecurityUser)SecurityContextHolder.getContext().getAuthentication().getPrincipal();

这对我有用..

© www.soinside.com 2019 - 2024. All rights reserved.