开始使用

假设我们要使用 LDAP 认证并在应用程序中管理用户。

首先,按照 installation 的说明在项目中安装 LDAP 扩展组件。

配置主要参数

现在,添加 LDAP 主要参数。我们将使用一个测试 LDAP 服务 - \ldap://ldap.forumsys.com:389/,其中有一些 测试用户

jmix.ldap.urls = ldap://ldap.forumsys.com:389/ 
jmix.ldap.base-dn = dc=example,dc=com
jmix.ldap.manager-dn = cn=read-only-admin,dc=example,dc=com
jmix.ldap.manager-password = password
jmix.ldap.user-search-filter = (uid={0})

jmix.ldap.default-roles 包含一组角色,这些角色将分配给每个在 LDAP 中认证的用户。必须要设置这个参数,因为没有角色的用户是不能登录应用程序的。

jmix.ldap.default-roles 属性设置为 ui-minimal

jmix.ldap.default-roles=ui-minimal

可以在 LDAP 属性 章节查询每个属性的含义。

同步设置

我们需要描述一下期望的用户同步方式。

当组件从应用程序中使用 LDAP 进行用户认证时,我们实现默认场景。如果用户在 LDAP 中认证成功,但应用程序中没有 UserDetails,则会自动同步,并根据对应的 LDAP 记录创建 UserDetails

声明一个 bean,实现 LdapUserDetailsSynchronizationStrategy 接口。扩展组件带有基础的抽象类实现:AbstractLdapUserDetailsSynchronizationStrategy,因此,简单的情况下,可以通过指定一个具体的 User 类并实现一个简单的映射来声明策略:

@Component("ldap_CustomUserSynchronizationStrategy")
public class CustomUserSynchronizationStrategy extends AbstractLdapUserDetailsSynchronizationStrategy<User> {

    private String getFirstName(String fullName) {
        return fullName.split(" ")[0];
    }

    @Override
    protected Class<User> getUserClass() {
        return User.class;
    }

    @Override
    protected void mapUserDetailsAttributes(User userDetails, DirContextOperations ctx) {
        userDetails.setFirstName(getFirstName(ctx.getStringAttribute("cn")));
        userDetails.setLastName(ctx.getStringAttribute("sn"));
        userDetails.setEmail(ctx.getStringAttribute("mail"));
    }
}

请注意,AbstractLdapUserDetailsSynchronizationStrategy 还会对在角色映射过程中产生的用户角色进行持久化。每次同步完成后,用户角色都会重写,不保留过期的角色分配。

所以,我们需要设置 jmix.ldap.synchronize-role-assignmentsfalse,以便在应用程序中手动管理用户角色。

同步策略声明完成后,用户会在每次登录时进行同步。如需禁用登录时的用户同步,可以设置 jmix.ldap.synchronize-user-on-loginfalse

如需完全使用 LDAP 管理用户而不在应用程序中保留用户,参阅 内存中的用户管理 章节。