这个问题在这里已有答案:
我想从会话中访问一些用户详细信息。我通过重写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";
}
您可以使用注释@AuthenticationPrincipal
直接访问ESecurityUser
。
@RequestMapping("")
public String toPeriodicAdReport(@ModelAttribute("advertFormHelper") AdvertFormHelper advertFormHelper,
Model model, @AuthenticationPrincipal ESecurityUser principal) {
principal.getCompanyId();
return "Test";
}
你不远......
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";
}
ESecurityUser e = (ESecurityUser)SecurityContextHolder.getContext().getAuthentication().getPrincipal();
这对我有用..