无论如何在Authentication / UserDetailsImpl对象中设置List<GrantedAuthority>
?在我的应用程序中,我有两层安全性,一个用于登录(使用我的自定义登录验证器,在我使用Authentication
设置UsernamePasswordAuthenticationToken
对象的类中)和一个用于“挑战问题” “提示用户回答特定问题的地方。
我想要做的是在用户回答质询问题后,在登录过程中创建的当前GrantedAuthority
中添加List<GrantedAuthority>
。
这可能吗?
答案 0 :(得分:18)
您可以使用以下代码执行此操作:
Collection<SimpleGrantedAuthority> oldAuthorities = (Collection<SimpleGrantedAuthority>)SecurityContextHolder.getContext().getAuthentication().getAuthorities();
SimpleGrantedAuthority authority = new SimpleGrantedAuthority("ROLE_ANOTHER");
List<SimpleGrantedAuthority> updatedAuthorities = new ArrayList<SimpleGrantedAuthority>();
updatedAuthorities.add(authority);
updatedAuthorities.addAll(oldAuthorities);
SecurityContextHolder.getContext().setAuthentication(
new UsernamePasswordAuthenticationToken(
SecurityContextHolder.getContext().getAuthentication().getPrincipal(),
SecurityContextHolder.getContext().getAuthentication().getCredentials(),
updatedAuthorities)
);
答案 1 :(得分:-1)
UserDetails.getAuthorities()
方法只返回一个Collection<GrantedAuthority>
对象。您可以使用适当的Collection
方法将新权限添加到该集合中。
Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal();
if (principal instanceof UserDetails) {
((UserDetails) principal).getAuthorities().add(New GrantedAuthorityImpl("ROLE_FOO"));
}
细拉