LDAP服务器
对于使用 LDAP 认证的系统(例如 Nexus),Casdoor 可以充当一个简单的 LDAP 服务器。它支持基于简单认证(Simple Authentication)的 bind 和 search。
端口
LDAP服务器默认监听389端口。可以通过 conf/app.conf 中的 ldapServerPort 修改。
行为
- 用户条目采用 posixAccount 风格。
- Bind:服务器解析
cn(用户名)和ou(组织)。dc会被忽略。它通过 Casdoor 验证用户,并为后续操作授予权限。 - Search:服务器检查客户端是否有权限(来自 bind),再相应返回结果。
只支持 Simple Authentication。
Bind
使用这种格式的 DN:cn=<username>,ou=<organization>,dc=example,dc=com。
示例:cn=admin,ou=built-in,dc=example,dc=com。把管理员的 DN 设成这个格式,然后用这个 DN 和用户密码进行 bind。成功后,客户端获得 search 权限。
搜索
bind 成功后:
- 单个用户(例如
built-in中的 Alice):Base DNou=built-in,dc=example,dc=com,过滤器cn=Alice。 - 某个组织的所有用户(例如
built-in):Base DNou=built-in,dc=example,dc=com,过滤器cn=*。 - 所有组织的所有用户(如果有权限):Base DN
ou=*,dc=example,dc=com,过滤器cn=*。 - 某个群组中的用户:使用
(memberOf=organization_name/group_name)这样的过滤器。
用户属性
| 属性 | 描述 | 来源 |
|---|---|---|
cn | 通用名 | 用户名 |
uid | 用户 ID | 用户 ID |
homeDirectory | 主目录 | /home/{username} |
邮箱 | 邮箱 | 用户邮箱 |
手机 | 电话 | 用户手机号 |
sn | 姓 | 用户的姓 |
givenName | 名 | 用户的名 |
memberOf | 用户所属的组 | 用户所属的群组 |
loginShell | 登录 shell | user.Properties["loginShell"],默认为 /bin/bash |
gecos | GECOS(全名) | user.DisplayName,为空时退回 user.Name |
sshPublicKey | SSH 公钥 | user.Properties["sshPublicKey"],为空时省略 |
所有条目还带有 objectClass: posixAccount,这是 Linux 认证中 PAM 和 NSS 所必需的。
Linux 机器登录
Casdoor 的 LDAP 服务器提供兼容 posixAccount 的条目,所以 Linux 主机可以通过 sssd、nss-ldap 或 pam_ldap 等标准工具直接用 Casdoor 认 证用户。
要为每个用户设置 loginShell 和 sshPublicKey,在用户的 Properties 字段(键值映射)中设置:
{
"loginShell": "/bin/zsh",
"sshPublicKey": "ssh-ed25519 AAAA..."
}
如果没有设置 loginShell,使用 /bin/bash。如果没有 sshPublicKey,LDAP 条目中就完全不包含这个属性。
RFC 风格的功能
Root DSE(baseDN="")
- namingContexts:
ldapsearch -x -H ldap://<casdoor-host>:389 -D "cn=admin,ou=built-in" -w <passwd> -b "" -s base "(objectClass=*)" namingContexts,返回可见的组织 DN。 - subschemaSubentry:
ldapsearch -x -H ldap://<casdoor-host>:389 -D "cn=admin,ou=built-in" -w <passwd> -b "" -s base "(objectClass=*)" subschemaSubentry,返回subschemaSubentry: cn=Subschema。
Schema
查询 objectClasses:ldapsearch -x -H ldap://<casdoor-host>:389 -D "cn=admin,ou=built-in" -w <passwd> -b "cn=Subschema" -s base "(objectClass=*)" objectClasses,返回 posixAccount 和 posixGroup 的定义。
POSIX 过滤器
(objectClass=posixAccount):用户列表。(objectClass=posixGroup):某个组织的群组列表(例如-b "ou=<org>" "(objectClass=posixGroup)")。
(objectClass=posixGroup) 不支持 (&(objectClass=posixGroup)(cn=<group>)) 这样的组合过滤器。用 memberOf 查找群组成员。