5.4. LDAP 域
LDAP 域连接到 LDAP 服务器,如 OpenLDAP、红帽目录服务器、Apache 目录服务器或 Microsoft Active Directory,以验证用户并获取成员资格信息。
根据服务器和部署的类型,LDAP 服务器可以有不同的条目布局。本文档超出了本文档的范围,为所有可能的配置提供示例。
5.4.1. LDAP 连接属性
指定 LDAP 域配置中的 LDAP 连接属性。
需要以下属性:
url |
指定 LDAP 服务器的 URL。URL 的格式应为 |
主体 | 在 LDAp 服务器中指定有效用户的可分辨名称(DN)。DN 在 LDAP 目录结构中唯一标识用户。 |
credential | 对应于与上述主体关联的密码。 |
LDAP 连接的主体必须具有必要的特权,才能执行 LDAP 查询和访问特定属性。
启用 连接池可显著提高
LDAP 服务器身份验证的性能。连接池机制由 JDK 提供。如需更多信息,请参阅 连接池配置和 Java Tutorials:池。
5.4.2. LDAP 域用户验证方法
在 LDAP 域中配置用户验证方法。
LDAP 域可以通过两种方式验证用户:
散列化密码比较 |
通过比较存储在用户密码属性中的散列密码(通常为 |
直接验证 | 使用提供的凭证对 LDAP 服务器进行身份验证
直接验证是与 Active Directory 搭配使用的唯一方法,因为禁止访问 |
您不能使用通过 direct-verification
属性执行哈希的端点身份验证机制,因为此方法需要以明文形式提供密码。因此,您必须将 BASIC
身份验证机制与 REST 端点一起使用,并将 PLAIN
与 Hot Rod 端点一起使用,才能与 Active Directory Server 集成。更安全的替代方案是使用 Kerberos,它允许 SPNEGO
、GSSAPI
和 GS2-KRB5
身份验证机制。
LDAP 域搜索目录以查找与经过身份验证的用户对应的条目。rdn-identifier
属性指定一个 LDAP 属性,它根据提供的标识符查找用户条目,通常是用户名;例如,uid
或 sAMAccountName
属性。向配置中添加 search-recursive="true"
以递归搜索目录。默认情况下,搜索用户条目使用 (rdn_identifier={0})
过滤器。您可以使用 filter-name
属性指定不同的过滤器。
5.4.3. 将用户条目映射到其关联的组
在 LDAP 域配置中,指定 attribute-mapping
元素以检索和关联用户所属的所有组。
成员资格信息通常以两种方式存储:
-
在组条目下,通常具有
member
属性中的 classgroupOfNames
或groupOfUniqueNames
。这是除 Active Directory 以外的大多数 LDAP 安装中的默认行为。在这种情况下,您可以使用属性过滤器。此过滤器搜索与提供的过滤器匹配的条目,该条目会找到与用户 DN 相等的member
属性的组。然后,过滤器提取
由 指定的组条目的 CN,并将其添加到用户的Role
中。 在
memberOf
属性的用户条目中。这通常是 Active Directory 的情况。在这种情况下,您应该使用如下属性引用:<attribute-reference reference="memberOf" from="cn" to="Roles" />
此引用从用户条目获取所有
memberOf
属性,按照从 指定的方式
提取 CN,并将它们添加到用户的组中(角色是
用于映射组的内部名称)。
5.4.4. LDAP 域配置参考
XML
<server xmlns="urn:infinispan:server:15.0"> <security> <security-realms> <security-realm name="ldap-realm"> <!-- Specifies connection properties. --> <ldap-realm url="ldap://my-ldap-server:10389" principal="uid=admin,ou=People,dc=infinispan,dc=org" credential="strongPassword" connection-timeout="3000" read-timeout="30000" connection-pooling="true" referral-mode="ignore" page-size="30" direct-verification="true"> <!-- Defines how principals are mapped to LDAP entries. --> <identity-mapping rdn-identifier="uid" search-dn="ou=People,dc=infinispan,dc=org" search-recursive="false"> <!-- Retrieves all the groups of which the user is a member. --> <attribute-mapping> <attribute from="cn" to="Roles" filter="(&(objectClass=groupOfNames)(member={1}))" filter-dn="ou=Roles,dc=infinispan,dc=org"/> </attribute-mapping> </identity-mapping> </ldap-realm> </security-realm> </security-realms> </security> </server>
JSON
{ "server": { "security": { "security-realms": [{ "name": "ldap-realm", "ldap-realm": { "url": "ldap://my-ldap-server:10389", "principal": "uid=admin,ou=People,dc=infinispan,dc=org", "credential": "strongPassword", "connection-timeout": "3000", "read-timeout": "30000", "connection-pooling": "true", "referral-mode": "ignore", "page-size": "30", "direct-verification": "true", "identity-mapping": { "rdn-identifier": "uid", "search-dn": "ou=People,dc=infinispan,dc=org", "search-recursive": "false", "attribute-mapping": [{ "from": "cn", "to": "Roles", "filter": "(&(objectClass=groupOfNames)(member={1}))", "filter-dn": "ou=Roles,dc=infinispan,dc=org" }] } } }] } } }
YAML
server: security: securityRealms: - name: ldap-realm ldapRealm: url: 'ldap://my-ldap-server:10389' principal: 'uid=admin,ou=People,dc=infinispan,dc=org' credential: strongPassword connectionTimeout: '3000' readTimeout: '30000' connectionPooling: true referralMode: ignore pageSize: '30' directVerification: true identityMapping: rdnIdentifier: uid searchDn: 'ou=People,dc=infinispan,dc=org' searchRecursive: false attributeMapping: - filter: '(&(objectClass=groupOfNames)(member={1}))' filterDn: 'ou=Roles,dc=infinispan,dc=org' from: cn to: Roles
5.4.4.1. LDAP 域主体重写
SASL 身份验证机制获取的主体,如 GSSAPI
、GS2-KRB5
和 Negotiate
通常包括域名,例如 myuser@INFINISPAN.ORG
。在 LDAP 查询中使用这些主体前,需要转换它们以确保其兼容性。这个过程被称为重写。
网格包括以下转换器:
case-principal-transformer |
将主体重写为所有大写或所有小写。例如, |
common-name-principal-transformer |
以 LDAP Distinguished Name 格式重写主体(由 RFC 4514定义)。它提取 |
regex-principal-transformer | 使用带有捕获组的正则表达式重写主体,例如,用于提取任何子字符串。 |
5.4.4.2. LDAP 主体重写配置参考
问题单主体转换器
XML
<server xmlns="urn:infinispan:server:15.0"> <security> <security-realms> <security-realm name="ldap-realm"> <ldap-realm url="ldap://${org.infinispan.test.host.address}:10389" principal="uid=admin,ou=People,dc=infinispan,dc=org" credential="strongPassword"> <name-rewriter> <!-- Defines a rewriter that transforms usernames to lowercase --> <case-principal-transformer uppercase="false"/> </name-rewriter> <!-- further configuration omitted --> </ldap-realm> </security-realm> </security-realms> </security> </server>
JSON
{ "server": { "security": { "security-realms": [{ "name": "ldap-realm", "ldap-realm": { "principal": "uid=admin,ou=People,dc=infinispan,dc=org", "url": "ldap://${org.infinispan.test.host.address}:10389", "credential": "strongPassword", "name-rewriter": { "case-principal-transformer": { "uppercase": false } } } }] } } }
YAML
server: security: securityRealms: - name: "ldap-realm" ldapRealm: principal: "uid=admin,ou=People,dc=infinispan,dc=org" url: "ldap://${org.infinispan.test.host.address}:10389" credential: "strongPassword" nameRewriter: casePrincipalTransformer: uppercase: false # further configuration omitted
通用名称主体转换器
XML
<server xmlns="urn:infinispan:server:15.0"> <security> <security-realms> <security-realm name="ldap-realm"> <ldap-realm url="ldap://${org.infinispan.test.host.address}:10389" principal="uid=admin,ou=People,dc=infinispan,dc=org" credential="strongPassword"> <name-rewriter> <!-- Defines a rewriter that obtains the first CN from a DN --> <common-name-principal-transformer /> </name-rewriter> <!-- further configuration omitted --> </ldap-realm> </security-realm> </security-realms> </security> </server>
JSON
{ "server": { "security": { "security-realms": [{ "name": "ldap-realm", "ldap-realm": { "principal": "uid=admin,ou=People,dc=infinispan,dc=org", "url": "ldap://${org.infinispan.test.host.address}:10389", "credential": "strongPassword", "name-rewriter": { "common-name-principal-transformer": {} } } }] } } }
YAML
server: security: securityRealms: - name: "ldap-realm" ldapRealm: principal: "uid=admin,ou=People,dc=infinispan,dc=org" url: "ldap://${org.infinispan.test.host.address}:10389" credential: "strongPassword" nameRewriter: commonNamePrincipalTransformer: ~ # further configuration omitted
正则表达式主体转换器
XML
<server xmlns="urn:infinispan:server:15.0"> <security> <security-realms> <security-realm name="ldap-realm"> <ldap-realm url="ldap://${org.infinispan.test.host.address}:10389" principal="uid=admin,ou=People,dc=infinispan,dc=org" credential="strongPassword"> <name-rewriter> <!-- Defines a rewriter that extracts the username from the principal using a regular expression. --> <regex-principal-transformer pattern="(.*)@INFINISPAN\.ORG" replacement="$1"/> </name-rewriter> <!-- further configuration omitted --> </ldap-realm> </security-realm> </security-realms> </security> </server>
JSON
{ "server": { "security": { "security-realms": [{ "name": "ldap-realm", "ldap-realm": { "principal": "uid=admin,ou=People,dc=infinispan,dc=org", "url": "ldap://${org.infinispan.test.host.address}:10389", "credential": "strongPassword", "name-rewriter": { "regex-principal-transformer": { "pattern": "(.*)@INFINISPAN\\.ORG", "replacement": "$1" } } } }] } } }
YAML
server: security: securityRealms: - name: "ldap-realm" ldapRealm: principal: "uid=admin,ou=People,dc=infinispan,dc=org" url: "ldap://${org.infinispan.test.host.address}:10389" credential: "strongPassword" nameRewriter: regexPrincipalTransformer: pattern: (.*)@INFINISPAN\.ORG replacement: "$1" # further configuration omitted
5.4.4.3. 使用 Data Grid 的 LDAP 用户和组映射过程
本例演示了加载和内部将 LDAP 用户和组映射到 Data Grid 主题的过程。以下是 LDIF (LDAP 数据交换格式)文件,它描述了多个 LDAP 条目:
LDIF
# Users dn: uid=root,ou=People,dc=infinispan,dc=org objectclass: top objectclass: uidObject objectclass: person uid: root cn: root sn: root userPassword: strongPassword # Groups dn: cn=admin,ou=Roles,dc=infinispan,dc=org objectClass: top objectClass: groupOfNames cn: admin description: the Infinispan admin group member: uid=root,ou=People,dc=infinispan,dc=org dn: cn=monitor,ou=Roles,dc=infinispan,dc=org objectClass: top objectClass: groupOfNames cn: monitor description: the Infinispan monitor group member: uid=root,ou=People,dc=infinispan,dc=org
root
用户是 admin
和 monitor
组的成员。
当使用密码 strongPassword
验证用户 root
的请求时,会在其中一个端点上执行以下操作:
- 使用所选主体转换器(可选)重写用户名。
-
realm 在
ou=People,dc=infinispan,dc=org
树中搜索,其uid
属性等于root
,并查找 DNuid=root,ou=People,dc=infinispan,dc=org
的条目,这将成为用户主体。 -
realm 在
u=Roles,dc=infinispan,dc=org
树中搜索包含member
属性中的uid=root,ou=People,dc=infinispan,dc=org
的条目。在这种情况下,它找到两个条目:
cn=admin,ou=Roles,dc=infinispan,dc=org
和cn=monitor,ou=Roles,dc=infinispan,dc=org
。从这些条目中,它会提取作为组主体的cn
属性。
因此,生成的主题将类似如下:
-
NamePrincipal:
uid=root,ou=People,dc=infinispan,dc=org
-
RolePrincipal:
admin
-
RolePrincipal:
monitor
此时,全局授权映射程序应用于上述主题,将主体转换为角色。然后,角色会扩展到一组权限,这些权限会根据请求的缓存和操作进行验证。