5.4. 使用 LDAP 进行身份验证和授权
				LDAP 登录模块通过根据中央 X.500 目录服务器中存储的用户数据检查传入的凭据来启用身份验证和授权。它由 org.apache.activemq.artemis.spi.core.security.jaas.LDAPLoginModule 实施。
			
5.4.1. 配置 LDAP 以验证客户端 复制链接链接已复制到粘贴板!
以下示例步骤演示了如何使用 LDAP 验证客户端。
步骤
- 
							打开 
<broker-instance-dir>/etc/broker.xml配置文件。 在
security-settings元素内,添加一个security-setting元素来配置权限。例如:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 上述配置为 所有 队列分配特定权限
到用户角色的成员。- 
							打开 
<broker-instance-dir>/etc/login.config文件。 根据您要使用的目录服务,配置 LDAP 登录模块。
如果您使用 Microsoft Active Directory 目录服务,请添加类似以下示例的配置:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注意如果使用 Microsoft Active Directory,并且需要为
connectionUsername属性指定一个空格(例如OU=System Accounts)的值,您必须将该值包括在双引号("")中,并使用反斜杠(\)转义对对中的每个双引号("")。例如,connectionUsername="CN=Administrator,CN=Users,OU=\"System Accounts\",DC=example,DC=com"。如果您使用 ApacheDS 目录服务,请添加类似以下示例的配置:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow debug- 
												打开(
true)或关闭(false)。默认值为:false。 initialContextFactory- 
												必须始终设置为 
com.sun.jndi.ldap.LdapCtxFactory connectionURL- 
												使用 LDAP URL __<ldap://Host:Port> 的目录服务器位置。一个(可选)可以通过添加正斜杠 
/(后跟目录树中特定节点的 DN)来证明这个 URL。Apache DS 的默认端口为10389,而对于 Microsoft AD 的默认值是389。 connectionUsername- 
												打开与目录服务器的连接的用户的可区分名称(DN)。例如: 
uid=admin,ou=system。目录服务器通常需要客户端显示用户名/密码凭据,以便能打开连接。 connectionPassword- 
												与来自 
connectionUsername的 DN 匹配的密码。在目录服务器中,在 Directory Information Tree (DIT)中,密码通常作为userPassword属性存储在相应的目录条目中。 connectionProtocol- 支持所有值,但实际上没有被使用。必须明确设置这个选项,因为它没有默认值。
 connectionTimeout指定代理可以连接到目录服务器的最长时间,以毫秒为单位。如果代理无法在此时间内连接到目录 s,它将会中止连接尝试。如果您为此属性指定零或小于值,则使用底层 TCP 协议的超时值。如果没有指定值,代理会无限期等待建立连接,或者底层网络超时。
当为连接池请求了连接池时,此属性指定代理在达到最大池大小且池中所有连接都处于连接的最长时间。如果您指定了零或更少值,则代理会无限期等待连接可用。否则,代理会在达到最长等待时间时中止连接尝试。
身份验证- 
												指定绑定到 LDAP 服务器时使用的身份验证方法。这个参数可以设置为 
简单(需要用户名和密码)或none(允许匿名访问)。 userBase- 
												选择 DIT 的特定子树来搜索用户条目。子树通过 DN 指定,用于指定子树的基本节点。例如,将此选项设置为 
ou=User,ou=ActiveMQ,ou=system,ou=system,搜索用户条目仅限于ou=User,ou=ActiveMQ,ou=system节点下的子树。 userSearchMatching- 
												指定一个 LDAP 搜索过滤器,它应用到 
userBase选择的子树。详情请查看下面的 第 5.4.1.1 节 “搜索匹配参数” 部分。 userSearchSubtree- 
												相对于由 
userBase指定的节点,指定用户条目的搜索深度。此选项是一个布尔值。指定一个false值表示搜索尝试匹配用户Base节点的其中一个子条目(映射到javax.naming.directory.SearchControls.ONELEVEL_SCOPE)。指定一个true值表示搜索尝试匹配属于用户Base节点 的子树 的任何条目(映射到javax.naming.directory.SearchControls.SUBTREE_SCOPE)。 userRoleName- user 条目的属性名称,其中包含用户的角色名称列表。角色名称由代理的授权插件解析为组名称。如果省略这个选项,则不会从用户条目中提取角色名称。
 readTimeout- 指定代理可以等待从目录服务器到 LDAP 请求的响应的最长时间,以毫秒为单位。如果代理没有从目录服务器接收响应,代理会中止请求。如果您指定一个零个或更少值,或者您没有指定值,则代理会无限期等待目录服务器中的响应进入 LDAP 请求。
 roleBase- 
												如果角色数据直接存储在目录服务器中,则可以使用角色选项(角色
Base、roleSearchMatching、roleSearchSubtree和roleName)的组合来指定userRoleName选项。这个选项选择 DIT 的特定子树来搜索 role/group 条目。子树通过 DN 指定,用于指定子树的基本节点。例如,将此选项设置为ou=Group,ou=ActiveMQ,ou=system,ou=system ,ou=system 条目的搜索仅限于ou=Group,ou=ActiveMQ,ou=systemnode 下的子树。 roleName- 角色条目的属性类型,其中包含角色/组的名称(如 C、O、OU 等)。如果忽略了这个选项,则有效禁用角色搜索功能。
 roleSearchMatching- 
												指定 LDAP 搜索过滤器,它应用到 
roleBase选择的子树。详情请查看下面的 第 5.4.1.1 节 “搜索匹配参数” 部分。 roleSearchSubtree根据
roleBase指定的节点,指定角色条目的搜索深度。如果设置为false(默认为 false),则搜索尝试匹配角色Base节点的其中一个子条目(映射到javax.naming.directory.SearchControls.ONELEVEL_SCOPE)。如果为true,它将尝试匹配属于角色Base 节点的子树的任何条目(映射到javax.naming.directory.SearchControls.SUBTREE_SCOPE)。注意Apache DS 使用
DN路径的 OID 部分。Microsoft Active Directory 使用CN部分。例如,您可以在 Apache DS 中使用 DN 路径,如oid=testuser,dc=example,dc=com,而您可能在 Microsoft Active Directory 中使用 DN 路径,如cn=testuser,dc=example,dc=com。
- 启动或重启代理(服务或进程)。
 
5.4.1.1. 搜索匹配参数 复制链接链接已复制到粘贴板!
userSearchMatching在传递给 LDAP 搜索操作前,该配置参数提供的字符串值将受到字符串替换的约束,如
java.text.MessageFormat类所实施。
这意味着,特殊的字符串
{0}将被用户名替换,如从传入客户端凭证中提取。替换后,字符串将解释为 LDAP 搜索过滤器(语法由 IETF 标准 RFC 2254)定义。
例如,如果将这个选项设置为
(uid={0}),并且收到的用户名是jdoe,则搜索过滤器在字符串替换后变成(uid=jdoe)。
如果生成的搜索过滤器应用到用户群选择的子树,
ou=User,ou=ActiveMQ,ou=system,ou=system 可与条目uid=jdoe,ou=User,ou=ActiveMQ,ou=system相匹配。
roleSearchMatching这的工作方式与
userSearchMatching选项类似,但它支持两个替换字符串。
替换字符串
{0}替换匹配的用户条目的完整 DN(即用户搜索的结果)。例如,对于用户,jdoe,替换的字符串可以是uid=jdoe,ou=User,ou=ActiveMQ,ou=system。
替换字符串
{1}替换收到的用户名。例如,jdoe.
如果此选项设置为
(member=uid={1}),并且收到的用户名是jdoe,则搜索过滤器在字符串替换后变成(member=uid=jdoe)(假设 ApacheDS 搜索过滤器语法)。
如果生成的搜索过滤器应用到角色变量基础的子树,则
ou=Group,ou=ActiveMQ,ou=system,它将与member属性等于uid=jdoe的所有角色条目匹配(member属性的值是 DN)。
必须始终设置这个选项,即使角色搜索被禁用,因为它没有默认值。如果使用 OpenLDAP,搜索过滤器的语法为
(member:=uid=jdoe)。
其他资源
- 有关搜索过滤器语法的简短介绍,请参阅 甲骨文 JNDI 教程。