开始使用
假设我们要使用 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-assignments 为 false
,以便在应用程序中手动管理用户角色。
同步策略声明完成后,用户会在每次登录时进行同步。如需禁用登录时的用户同步,可以设置 jmix.ldap.synchronize-user-on-login 为 false
。
如需完全使用 LDAP 管理用户而不在应用程序中保留用户,参阅 内存中的用户管理 章节。