Spring Security:设置GrantedAuthorities

时间:2013-02-05 16:53:05

标签: spring security authentication

无论如何在Authentication / UserDetailsImpl对象中设置List<GrantedAuthority>?在我的应用程序中,我有两层安全性,一个用于登录(使用我的自定义登录验证器,在我使用Authentication设置UsernamePasswordAuthenticationToken对象的类中)和一个用于“挑战问题” “提示用户回答特定问题的地方。

我想要做的是在用户回答质询问题后,在登录过程中创建的当前GrantedAuthority中添加List<GrantedAuthority>

这可能吗?

2 个答案:

答案 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"));
}

细拉