获取用户权限

当角色根据 LDAP 进行同步时,按照下列步骤获取:

  • 从用户所属的分组获取角色

    生成的授权由用户所属的分组组成。默认情况下,使用分组的 cn 属性获取权限名称。可以通过 jmix.ldap.group-role-attribute 应用程序属性更换成其他属性。

  • 从用户的属性获取角色

    用户角色还可以基于其自身的属性添加。

    注册一个 Spring bean,实现 LdapUserAdditionalRoleProvider 接口,在 bean 内实现`getAdditionalRoles()` 方法。示例:

    @Component("demo_MyLdapUserAdditionalRoleProvider")
    public class MyLdapUserAdditionalRoleProvider implements LdapUserAdditionalRoleProvider {
    
        @Override
        public Set<GrantedAuthority> getAdditionalRoles(DirContextOperations user, String username) {
            return new HashSet<>();
        }
    }
  • 使用默认角色

    jmix.ldap.default-roles 应用程序属性包含以逗号分隔的一组角色,这些角色会默认分配给每个使用 LDAP 认证的用户。

生成的授权列表会传递给 JmixLdapGrantedAuthoritiesMapper 以获取最终的权限集合。这个映射器将之前获取的授权映射为 Jmix 的 GrantedAuthority

例如,假设初始的列表中只包含一个简单的授权,值为 Administrators。首先,映射器会尝试查找具有相同角色编码的资源角色。如果没找到,则尝试查找具有相同编码的行级角色。如果仍未找到,则此角色不会添加至最终的列表。

你可以自己实现 LdapAuthorityToJmixRoleCodesMapper 接口,将 LDAP 授权和 Jmix 角色编码进行映射。可以将多个 Jmix 角色编码映射至一个 LDAP 分组,角色可以是资源角色或行级角色。

下面示例中,bean 实现了将 mathematicianscientists LDAP 分组映射至 Jmix 角色编码:

@Component("l_CustomAuthorityMapperBean")
public class CustomAuthorityMapperBean implements LdapAuthorityToJmixRoleCodesMapper {

    @Override
    public Collection<String> mapAuthorityToJmixRoleCodes(String authority) { (1)
        Collection<String> roleCollection = new ArrayList<>();
        if (authority.equals("mathematicians")) { (2)
            roleCollection.add("system-full-access");
        } else {
            roleCollection.add(authority + "-resource-role"); (3)
            roleCollection.add(authority + "-row-level-role");
        }
        return roleCollection;
    }
}
1 重写方法,方法接收 LDAP 授权作为输入参数,返回与其匹配的一组角色编码。
2 对于 mathematicians 分组,LDAP 用户可以获得 system-full-access 角色。
3 对于 scientists 分组,LDAP 用户可以获得两个角色:scientists-resource-rolescientists-row-level-role