3

有没有办法撤销弹簧安全角色?具体来说,我想从UserDetails.getAuthorities()对象中删除元素

Collection<? extends GrantedAuthority> authorities = userDetails.getAuthorities();
authorities.remove(new SimpleGrantedAuthority("ROLE_TO_BE_REMOVED"));

此代码将成功编译,但会UnsupportedOperationException在调用 remove 时抛出。问题是标准的 Authentication 实现确保 getAuthorities 返回的 Collection 是不可修改的(它返回Collections $UnmodifiableRandomAccessList<E>)。

所以我需要的是其他一些删除角色的方法,或者绕过集合不变性的方法。

使用的 Spring 版本:3.2.2.RELEASE,Spring 安全版本:3.1.3.RELEASE

4

2 回答 2

1

这应该可以解决问题:

public void removeRole(String role){
    Authentication auth = SecurityContextHolder.getContext().getAuthentication();

    List<GrantedAuthority> updatedAuthorities =
        auth.getAuthorities().stream()
        .filter(r -> !role.equals(r.getAuthority()))
        .collect(Collectors.toList());

    Authentication newAuth = new UsernamePasswordAuthenticationToken(
            auth.getPrincipal(), auth.getCredentials(), updatedAuthorities);

    SecurityContextHolder.getContext().setAuthentication(newAuth);
}   
于 2018-12-07T11:03:16.770 回答
0

我猜你需要使用org.springframework.security.provisioning.UserDetailsManager.updateUser().

于 2013-10-10T12:08:34.553 回答