春季安全:设置GrantedAuthorities(Spring Security: Set Gra

2019-08-16 19:07发布

反正是有设置List<GrantedAuthority>在认证/ UserDetailsImpl对象? 在我的应用程序,我有两种安全层,一个用于记录(使用我的自定义登录认证,设定在I类Authentication使用对象UsernamePasswordAuthenticationToken )一个用于“挑战问题”,并在提示用户来回答一个特定的问题。

我想要做的就是添加GrantedAuthority到当前List<GrantedAuthority>这是在登录过程中创建的,用户应答挑战的问题后。

这可能吗?

Answer 1:

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

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)
);


Answer 2:

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

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

细拉。



文章来源: Spring Security: Set GrantedAuthorities