以编程方式访问Spring Security角色层次结构

时间:2014-07-13 19:30:44

标签: spring spring-security javabeans

我有一个Spring Security角色层次结构设置如下:

ROLE_ADMIN > ROLE_MANAGER
ROLE_MANAGER > ROLE_USER
ROLE_USER > ROLE_GUEST

我发现自己需要创建一个可以根据角色否决PropertyChangeEvents的VetoableChangeListener(由于其中一个愚蠢的遗留设计问题)。

因此,在我的vetoableChange()方法中,需要根据层次结构否决更改。例如,某个字段不能被定义的层次结构中ROLE_MANAGER下面的任何角色更改,因此如果ROLE_USER尝试更改它,则抛出PropertyVetoException。

public void vetoableChange(PropertyChangeEvent evt) throws PropertyVetoException {

    String role = SecurityContextHolder.getContext().getAuthentication().getRoles().get(0);
    String propertyName = evt.getPropertyName();
    String requiredRole = getRequiredRole(propertyName);

    // determine if the current role is equal to or greater than
    // the required role, throw PropertyVetoException if not

}

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:4)

在您的听众中直接使用您定义的RoleHierarchy

Collection<? extends GrantedAuthority> roles = Collections.singletonList(new SimpleGrantedAuthority(userRole));
Collection<? extends GrantedAuthority> reachableRoles = roleHierarchy.getReachableGrantedAuthorities(roles);

if (reachableRoles.contains(requiredRole)) {
    // allow
} else {
    // deny
}

方法getReachableGrantedAuthorities(Collection<? extends GrantedAuthority>)返回所有可达权限的数组。可访问权限是直接分配的权限以及角色层次结构中可以(可以传递)到达的所有权限。

示例:

角色层次结构:ROLE_A&gt; ROLE_B和ROLE_B&gt; ROLE_C。

直接分配的权限:ROLE_A。

可达权限:ROLE_A,ROLE_B,ROLE_C。