LDAP业务场景集成¶
最后更新:2024-09-25
1. 什么是LDAP?¶
是一个开放的,中立的,工业标准的应用协议,通过IP协议提供访问控制和维护分布式信息的目录信息。 LDAP的一个常用用途是单点登录,用户可以在多个服务中使用同一个密码,通常用于公司内部网站的登录中(这样他们只需在公司计算机上登录一次,便可以自动登录到公司内部网)。
IDaaS提供ldap标准协议中的搜索、认证、新增、修改、删除、比较能力,以下统称为LdapServer
以上能力只针对于IDaaS中的组织机构ou、账户ud、组group
2. 提供能力¶
能力 |
概述 |
是否支持 |
说明 |
---|---|---|---|
bind |
认证 |
支持 |
提供U+P,U+OTP,U+P+OTP认证能力,支持simple认证方式 |
unbind |
取消认证/断开连接 |
支持 |
|
search |
搜索 |
支持 |
支持多种模式(base,one,sub),多种filter |
modify |
修改实体 |
支持 |
|
add |
新增实体 |
支持 |
|
delete |
删除实体 |
支持 |
|
compare |
比较指定数据是否有指定值 |
支持 |
3. 字段说明¶
3.1. 组织机构¶
类型: organizationalUnit
RDN: OU
字段 |
示例 |
说明 |
---|---|---|
objectClass |
top |
固定 |
objectClass |
organizationalUnit |
固定 |
organizationName |
test1 |
ou名称 |
ou |
test1 |
ou名称 |
type |
EXTERNAL_OU |
类型: |
enabled |
1 |
是否启用 0禁用1启用 |
externalId |
801601 |
外部ID |
sortNumber |
0 |
排序号 |
createTimestamp |
2022/2/8 9:44:58 |
创建时间 |
structuralObjectClass |
organizationalUnit |
固定 |
modifyTimestamp |
2022/3/9 3:44:47 |
更新时间 |
entryDN |
ou=test1,ou=人事组织,dc=idsmanager,dc=com |
dn路径 |
description |
组织1 |
组织描述 |
其他扩展字段按照扩展字段名返回 |
3.2. 账户¶
类型:inetOrgPerson
RDN: uid
字段 |
示例 |
说明 |
---|---|---|
ou |
801601 |
所属组织机构的外部ID |
uid |
test |
username |
displayName |
test |
显示名称 |
sn |
test |
显示名称 |
cn |
test |
显示名称 |
objectClass |
top |
固定 |
objectClass |
person |
固定 |
objectClass |
organizationalPerson |
固定 |
objectClass |
inetOrgPerson |
固定 |
test@as.cd |
邮箱 |
|
mobile |
18000000000 |
手机号 |
externalId |
123456 |
外部ID |
locked |
0 |
是否被锁定 0正常1锁定 |
enabled |
1 |
是否启用 0禁用1启用 |
expireTime |
2022/2/8 9:44:58 |
过期时间 |
modifyTimestamp |
2022/2/8 9:44:58 |
修改时间 |
entryDN |
uid=test,ou=test1,ou=人事组织,dc=idsmanager,dc=com |
dn路径 |
hasSubordinates |
FALSE |
是否有下级节点,固定FALSE |
createTimestamp |
2022/2/8 9:44:58 |
创建时间 |
structuralObjectClass |
inetOrgPerson |
固定 |
memberOf |
cn=test-group,ou=人事组织,dc=idsmanager,dc=com |
所属组的DN |
其他扩展字段按照扩展字段名返回 |
3.3. 组¶
类型: groupOfUniqueNames
RDN: cn
字段 |
示例 |
说明 |
---|---|---|
o |
123456 |
外部ID |
ou |
801601 |
所属OU的外部ID |
cn |
test |
显示名称 |
objectClass |
top |
固定 |
objectClass |
groupOfUniqueNames |
固定 |
type |
SELF_GROUP |
类型: |
enabled |
1 |
是否启用 0禁用1启用 |
externalId |
123456 |
外部ID |
uniqueMember |
uid=test,ou=test1,ou=人事组织,dc=idsmanager,dc=com |
组成员,DN形式 |
memberUid |
test |
组成员,username形式 |
modifyTimestamp |
2022/2/8 9:44:58 |
修改时间 |
entryDN |
cn=1,ou=test1,ou=人事组织,dc=idsmanager,dc=com |
DN路径 |
hasSubordinates |
FALSE |
是否有下级节点,固定FALSE |
createTimestamp |
2022/2/8 9:44:58 |
创建时间 |
structuralObjectClass |
groupOfUniqueNames |
固定 |
description |
组1 |
组描述 |
其他扩展字段按照扩展字段名返回 |
4. 能力介绍¶
4.1. bind (认证)¶
为了安全考虑,不允许匿名访问,支持Simple Authentication(U+P,U+OTP,U+P+OTP)
普通用户只能认证成功,不能做Search,Lookup,Modify,Add,Delete,Compare操作,需要在IDaaS中配置对应的LDAP菜单的直接权限才具有这些操作权限
协议 |
Simple Authenticetion |
|
---|---|---|
bind dn |
uid={username},dc=idsmanager,dc=com |
dc=idsmanager,dc=com |
password |
根据配置来定, 可以是idp4中用户密码,或者OTP,或者密码+OTP,如果是密码+OTP方式,将OTP直接拼在密码之后即可 |
配置文件定义 |
示例
ldapwhoami -h 127.0.0.1 -p 10389 -D "uid=xxx,dc=idsmanager,dc=com" -w "123456"
密码正确,则返回
dn:uid=admin,dc=idsmanager,dc=com
错误则返回
ldap_bind: Invalid credentials (49)
additional info: INVALID_CREDENTIALS: Bind failed: Invalid authentication
4.2. search(搜索)¶
支持ldap标准搜索语法,支持分页, 多种查找模式(search scope),多种过滤器(filter)
支持多种Filter,分别如下:
4.2.1. search scope(查找模式)¶
Base
base 模式只会查找并返回 baseDN 的信息
示例:
[root]# ldapsearch -h 127.0.0.1 -p 10389 -D "uid=admin,dc=idsmanager,dc=com" -w "123456" -b "dc=idsmanager,dc=com" -s base
dn:: dc=idsmanager,dc=com
#xxx 相关信息
search: 2
result: 0 Success
One
one 模式会查找BaseDN 及 baseDN 直属子节点
示例:
[root]# ldapsearch -h 127.0.0.1 -p 10389 -D "uid=admin,dc=idsmanager,dc=com" -w "123456" -b "dc=idsmanager,dc=com" -s one
dn:: ou=人事组织,dc=idsmanager,dc=com
#xxx 相关信息
dn:: ou=应用群组,dc=idsmanager,dc=com
#xxx 相关信息
dn:: uid=admin,dc=idsmanager,dc=com
#xxx 相关信息
search: 2
result: 0 Success
Sub
sub 模式会查找BaseDN 及 baseDN 下的所有子节点
示例
[root]# ldapsearch -h 127.0.0.1 -p 10389 -D "uid=admin,dc=idsmanager,dc=com" -w "123456" -b "dc=idsmanager,dc=com" -s sub
dn:: ou=人事组织,dc=idsmanager,dc=com
#xxx 相关信息
dn:: ou=应用群组,dc=idsmanager,dc=com
#xxx 相关信息
dn:: uid=admin,dc=idsmanager,dc=com
#xxx 相关信息
dn:: ou=test1,ou=人事组织,dc=idsmanager,dc=com
#xxx 相关信息
search: 2
result: 0 Success
4.2.2. search filter(过滤器)¶
存在
(attr=*)
查找包含特定属性的值的项,而不用管属性的值是什么。
示例: 查找有uid属性的数据
[root]# ldapsearch -h 127.0.0.1 -p 10389 -D "uid=admin,dc=idsmanager,dc=com" -w "123456" -b "dc=idsmanager,dc=com" -s sub '(uid=*)'
dn:: uid=admin,dc=idsmanager,dc=com
#xxx 相关信息
dn:: uid=test1,ou=test1,ou=人事组织,dc=idsmanager,dc=com
#xxx 相关信息
dn:: uid=test2,ou=test2,ou=人事组织,dc=idsmanager,dc=com
#xxx 相关信息
search: 2
result: 0 Success
相等
(attr=value)
查找所包含的属性值与指定值相同的项
示例: 查找uid为admin的数据
[root]# ldapsearch -h 127.0.0.1 -p 10389 -D "uid=admin,dc=idsmanager,dc=com" -w "123456" -b "dc=idsmanager,dc=com" -s sub '(uid=admin)'
dn:: uid=admin,dc=idsmanager,dc=com
#xxx 相关信息
search: 2
result: 0 Success
大于等于
(attr>=value)
查找特定项,该项中包含的属性的数字或字母值大于或等于指定的值。
示例: 查找age大于等于20的数据
[root]# ldapsearch -h 127.0.0.1 -p 10389 -D "uid=admin,dc=idsmanager,dc=com" -w "123456" -b "dc=idsmanager,dc=com" -s sub '(age>=20)'
dn:: uid=test1,ou=test1,ou=人事组织,dc=idsmanager,dc=com
age=30
#xxx 相关信息
search: 2
result: 0 Success
注意:在达梦和人大金仓环境,以及搜索字段在IDaaS中,如果是加密字段均不支持此查询方式
小于等于
(attr<=value)
查找特定项,该项中包含的属性的数字或字母值小于或等于指定的值。
示例: 查找age大于等于10的数据
[root]# ldapsearch -h 127.0.0.1 -p 10389 -D "uid=admin,dc=idsmanager,dc=com" -w "123456" -b "dc=idsmanager,dc=com" -s sub '(age<=10)'
dn:: uid=test2,ou=test2,ou=人事组织,dc=idsmanager,dc=com
age=10
#xxx 相关信息
search: 2
result: 0 Success
注意:在达梦和人大金仓环境,以及搜索字段在IDaaS中,如果是加密字段均不支持此查询方式
模糊搜索
(attr=value*) 或者 (attr=val*ue) 或者 (attr=*value)
手机号和邮箱在IDaaS里面是加密存储,因此不支持模糊查询
查找所包含的属性值与指定的子字符串相同的项
示例: 查找uid包含test前缀的的数据
[root]# ldapsearch -h 127.0.0.1 -p 10389 -D "uid=admin,dc=idsmanager,dc=com" -w "123456" -b "dc=idsmanager,dc=com" -s sub '(uid=test*)'
dn:: uid=test1,ou=test1,ou=人事组织,dc=idsmanager,dc=com
#xxx 相关信息
dn:: uid=test2,ou=test2,ou=人事组织,dc=idsmanager,dc=com
#xxx 相关信息
search: 2
result: 0 Success
近似匹配
(attr~=value)
查找特定项,该项中所含属性的值约等于指定的值。
示例: 查找uid约等于test的数据
[root]# ldapsearch -h 127.0.0.1 -p 10389 -D "uid=admin,dc=idsmanager,dc=com" -w "123456" -b "dc=idsmanager,dc=com" -s sub '(uid~=test)'
dn:: uid=test1,ou=test1,ou=人事组织,dc=idsmanager,dc=com
#xxx 相关信息
dn:: uid=test2,ou=test2,ou=人事组织,dc=idsmanager,dc=com
#xxx 相关信息
search: 2
result: 0 Success
目前仅支持全模糊匹配的方式,不支持分词匹配
组合过滤器:And
(&(attr=value)(attr=value))
查找所有子条件都满足的数据
示例: 查找uid包含test前缀,age=30的数据
[root]# ldapsearch -h 127.0.0.1 -p 10389 -D "uid=admin,dc=idsmanager,dc=com" -w "123456" -b "dc=idsmanager,dc=com" -s sub '(&(uid=test*)(age=30))'
dn:: uid=test1,ou=test1,ou=人事组织,dc=idsmanager,dc=com
#xxx 相关信息
search: 2
result: 0 Success
组合过滤器:Or
(|(attr=value)(attr=value))
查找所有子条件都满足的数据
示例: 查找uid包含test前缀或者age=30的数据
[root]# ldapsearch -h 127.0.0.1 -p 10389 -D "uid=admin,dc=idsmanager,dc=com" -w "123456" -b "dc=idsmanager,dc=com" -s sub '(|(uid=test*)(uid=admin))'
dn: uid=admin,dc=idsmanager,dc=com
#xxx 相关信息
dn: ou=test1,ou=人事组织,dc=idsmanager,dc=com
#xxx 相关信息
dn: ou=test2,ou=人事组织,dc=idsmanager,dc=com
#xxx 相关信息
search: 2
result: 0 Success
组合过滤器:Not
(!(attr=value))
查找所有子条件都不满足的数据
示例: 查找uid不包含test前缀的数据
[root]# ldapsearch -h 127.0.0.1 -p 10389 -D "uid=admin,dc=idsmanager,dc=com" -w "123456" -b "dc=idsmanager,dc=com" -s sub '!(uid=test*)'
dn: uid=admin,dc=idsmanager,dc=com
#xxx 相关信息
search: 2
result: 0 Success
4.3. add(新增)¶
支持ldap标准add语法,允许通过ldap添加用户、组织机构、组。
需要有父级组织机构的权限才能执行该操作
支持的类型如下:
组织机构:
支持对象类型(objectClass):organization、organizationalUnit
支持的字段列表如下:
rdn: 组织机构名称
字段 |
是否必须 |
示例 |
说明 |
---|---|---|---|
externalId |
否 |
801601 |
外部ID |
ou |
否 |
testou |
名称 |
organizationName |
否 |
名称 |
|
type |
否 |
SELF_OU |
类型: |
sortNumber |
否 |
0 |
排序号 |
description |
否 |
desc |
备注 |
enable |
否 |
0 |
是否启用 0禁用1启用 |
以上为支持的所有基础字段,其他字段将当作数据字典处理 |
用户:
支持对象类型(objectClass):inetOrgPerson、organizationalPerson、person、posixAccount
支持的字段列表如下:
rdn : username
字段 |
是否必须 |
示例 |
说明 |
---|---|---|---|
externalId |
否 |
801601 |
对象类型 |
displayName |
是 |
testud |
显示名称 |
sn |
否 |
显示名称,同displayName,传一个即可 |
|
cn |
否 |
显示名称,同displayName,传一个即可 |
|
password |
否 |
123456 |
不传,将生成随机密码,仅支持明文密码(Plain text) |
userPassword |
否 |
不传,将生成随机密码,仅支持明文密码(Plain text) |
|
否 |
test@test.com |
邮箱 |
|
否 |
邮箱,同mail,传一个即可 |
||
mobile |
否 |
18000000000 |
手机号 |
telephoneNumber |
否 |
手机号,同mobile,传一个即可 |
|
homePhone |
否 |
手机号,同mobile,传一个即可 |
|
description |
否 |
desc |
备注 |
enable |
否 |
0 |
是否启用 0禁用1启用 |
以上为支持的所有基础字段,其他字段将当作数据字典处理 |
组:
支持对象类型(objectClass):groupOfUniqueNames、posixGroup
支持的字段列表如下:
rdn : 组名称
字段 |
是否必须 |
示例 |
说明 |
---|---|---|---|
externalId |
否 |
801601 |
对象类型 |
cn |
否 |
testgroup |
名称 |
memberUid |
否 |
testud |
成员列表,可多个,账户username |
uniqueMember |
否 |
uid= |
成员列表,可多个,账户的DN或者username |
description |
否 |
desc |
备注 |
以上为支持的所有基础字段,其他字段将当作数据字典处理 |
示例
新建user_add.ldif文件,文件内容如下:
dn: cn=testud,ou=人事组织,dc=idsmanager,dc=com
objectClass: person
cn: 显示名称
执行以下命令,将在人事组织节点下面创建一个用户:
ldapadd -h 127.0.0.1 -p 10389 -D "uid=admin,dc=idsmanager,dc=com" -w "123456" -f ./user_add.ldif
成功,则返回
adding new entry "cn=testud,ou=人事组织,dc=idsmanager,dc=com"
错误,则返回
adding new entry "cn=testud,ou=人事组织,dc=idsmanager,dc=com"
ldap_add: Server is unwilling to perform (53)
additional info: UNWILLING_TO_PERFORM: failed for MessageType : ADD_REQUEST
Message ID : 2
Add Request :
Entry
dn: cn=testud,ou=人事组织,dc=idsmanager,dc=com
objectClass: person
cn: 显示名称
: 账户名称已经存在
4.4. modify(修改)¶
支持ldap标准add语法,允许通过ldap修改用户、组织机构、组。
需要有IDaaS中LDAP菜单权限才能执行该操作
支持的类型如下:
不支持修改RDN
组织机构:
支持的字段列表如下:
字段 |
是否必须 |
示例 |
说明 |
---|---|---|---|
ou |
否 |
testou |
名称 |
organizationName |
否 |
名称 |
|
sortNumber |
否 |
0 |
排序号 |
description |
否 |
desc |
备注 |
enable |
否 |
0 |
是否启用 0禁用1启用 |
以上为支持的所有基础字段,其他字段将当作数据字典处理 |
用户:
支持的字段列表如下:
字段 |
是否必须 |
示例 |
说明 |
---|---|---|---|
displayName |
否 |
testud |
显示名称 |
sn |
否 |
显示名称,同displayName,传一个即可 |
|
cn |
否 |
显示名称,同displayName,传一个即可 |
|
password |
否 |
123456 |
仅支持明文密码(Plain text) |
userPassword |
否 |
仅支持明文密码(Plain text) |
|
否 |
test@test.com |
邮箱 |
|
否 |
邮箱,同mail,传一个即可 |
||
mobile |
否 |
18000000000 |
手机号 |
telephoneNumber |
否 |
手机号,同mobile,传一个即可 |
|
homePhone |
否 |
手机号,同mobile,传一个即可 |
|
description |
否 |
desc |
备注 |
enable |
否 |
0 |
是否启用 0禁用1启用 |
以上为支持的所有基础字段,其他字段将当作数据字典处理 |
组:
支持对象类型(objectClass):groupOfUniqueNames、posixGroup
支持的字段列表如下:
rdn : 组名称
字段 |
是否必须 |
示例 |
说明 |
---|---|---|---|
cn |
否 |
testgroup |
名称 |
memberUid |
否 |
testud |
成员列表,可多个,账户username |
uniqueMember |
否 |
uid= |
成员列表,可多个,账户的DN或者username |
description |
否 |
desc |
备注 |
以上为支持的所有基础字段,其他字段将当作数据字典处理 |
示例
新建user_modify.ldif文件,文件内容如下:
dn: uid=testud,ou=人事组织,dc=idsmanager,dc=com
changetype: modify
replace: mail
mail: test@test.com
-
replace: cn
cn: newname
执行以下命令,将修改testud的邮箱为test@test.com,显示名称为newname
ldapmodify -h 127.0.0.1 -p 10389 -D "uid=admin,dc=idsmanager,dc=com" -w "123456" -f ./user_modify.ldif
成功,则返回
modifying entry "uid=testud,ou=人事组织,dc=idsmanager,dc=com"
错误,则返回
modifying entry "uid=testud,ou=人事组织,dc=idsmanager,dc=com"
ldap_modify: Server is unwilling to perform (53)
additional info: UNWILLING_TO_PERFORM: failed for MessageType : MODIFY_REQUEST
Message ID : 2
Modify Request
Object : 'uid=testud,ou=人事组织,dc=idsmanager,dc=com'
Modifications :
Modification[0]
Operation : replace
Modification : mail: test
Modification[1]
Operation : replace
Modification : cn: newname
: 邮箱格式不正确
如果要删除组下面的成员,新建ldif文件内容如下:
dn: uid=testud,ou=人事组织,dc=idsmanager,dc=com
changetype: modify
delete: members
members: xxxx
替换组下面的members的操作,是新增操作,历史的members会被覆盖
4.5. delete(删除)¶
支持ldap标准delete语法,允许通过ldap删除用户、组织机构、组。
需要有IDaaS中LDAP菜单权限才能执行该操作 该操作为逻辑删除,对应IDaaS中的离职操作。
示例:
执行以下命令,将删除testud账户
ldapdelete -h 127.0.0.1 -p 10389 -D "uid=admin,dc=idsmanager,dc=com" -w "123456" "uid=testud,ou=人事组织,dc=idsmanager,dc=com"
错误,则返回
ldap_delete: Server is unwilling to perform (53)
additional info: UNWILLING_TO_PERFORM: failed for MessageType : DEL_REQUEST
Message ID : 2
Del request
Entry : 'uid=testud,ou=人事组织,dc=idsmanager,dc=com'
org.apache.directory.api.ldap.model.message.DeleteRequestImpl@60c04066: 该username:testud 不存在
4.6. compare(比较)¶
支持ldap标准compare语法,允许通过ldap判断指定的某个属性值是否在某个实体中存在,存在则返回true,否则返回false
示例:
判断testud该账户邮箱是否等于test@test.com
ldapcompare -h 127.0.0.1 -p 10389 -D "uid=admin,dc=idsmanager,dc=com" -w "123456" "uid=testud,ou=人事组织,dc=idsmanager,dc=com" "email:test@test.com"
存在,则返回
Compare Result: Compare True (6)
Matched DN: uid=testud,ou=人事组织,dc=idsmanager,dc=com
TRUE
不存在,则返回
Compare Result: Compare False (5)
Matched DN: uid=testud,ou=人事组织,dc=idsmanager,dc=com
FALSE
5.1. 使用¶
5.2. 测试¶
使用任意ldap客户端工具验证即可,这里以LdapBrowser为例:
打开LDAP Browser,新建Profile,输入一个profilename,点击下一步
其中host,填入ldapserver服务器地址, port默认10389, ssl port为10636
base dn填入配置文件指定的dn,默认dc=idsmanager,dc=com
选择other credentials中的simple认证方式
principal 格式: uid=xxxx,ou=Peoples,dc=idsmanager,dc=com
password: 此账号在idp4中对应的密码
点击完成保存配置.