我有一个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
}
有人可以帮忙吗?
答案 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。