31

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

我想要做的是在用户回答挑战问题后,在登录过程中创建GrantedAuthority的 current中添加一个。List<GrantedAuthority>

这可能吗?

4

2 回答 2

34

你可以用下面的代码做到这一点:

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)
);
于 2016-07-04T08:31:08.907 回答
-4

UserDetails.getAuthorities()方法只返回一个Collection<GrantedAuthority>对象。您可以使用适当的Collection方法将您的新权限添加到该集合。

Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal();
if (principal instanceof UserDetails) {
    ((UserDetails) principal).getAuthorities().add(New GrantedAuthorityImpl("ROLE_FOO"));
}

细拉。

于 2013-05-13T18:38:01.800 回答