从多个 OU 中递归查询用户的 LDAP 角色

Posted

技术标签:

【中文标题】从多个 OU 中递归查询用户的 LDAP 角色【英文标题】:Recursively query LDAP roles from multiple OUs for a User 【发布时间】:2017-08-28 02:05:42 【问题描述】:

我在 WildFly 9.0.2 服务器上运行 Web 应用程序,该服务器具有自定义登录领域(需要递归查询多个组织单元 A 以获取从组织单元 C 为用户查询的组织单元 B),该域配置为像这样的standalone.xml:

<security-realm name="LoginRealm">
   <authentication>
       <ldap connection="EC2" base-dn="ou=users,dc=test,dc=de">
           <username-filter attribute="uid"/>
       </ldap>
   </authentication>
</security-realm>
...
<security-domain name="other" cache-type="default">
    <authentication>
        <login-module code="de.test.LoginModule" flag="required">
            <module-option name="principalDNPrefix" value="uid="/>
            <module-option name="principalDNSuffix" value=",ou=users,dc=test,dc=de"/>
            <module-option name="rolesCtxDN" value="ou=groups,dc=test,dc=de"/>
            <module-option name="roleAttributeID" value="cn"/>
            <module-option name="roleAttributeIsDN" value="false"/>
            ...

用户通过提供他的用户名(例如 testA)、密码(例如随便什么)并从下拉菜单中选择一个用户组(例如 UserGroupA)来登录网站。 然后扩展 LdapLoginModule 的自定义登录模块 (de.test.LoginModule.class) 通过从独立 xml 获取前缀并在其后添加后缀来构建主体字符串来执行角色查找 例如前缀:uid= 由 LoginModule 构建:testA,ou=UserGroupA 后缀:,ou=users,dc=test,dc=de 结果:uid=testA,ou=UserGroupA,ou=users,dc=test,dc=de 现在可以完美运行。检索来自ou=groups,dc=test,dc=de 的角色,并执行在 web.xml 中定义的具有相应角色的安全约束。

<security-constraint>
    <display-name>Test-Service</display-name>
    <web-resource-collection>
        <web-resource-name>Test</web-resource-name>
        <url-pattern>/admin/*</url-pattern>
        <http-method>GET</http-method>
        <http-method>POST</http-method>
    </web-resource-collection>
    <auth-constraint>
        <description>Only Project Processors may see this</description>
        <role-name>Project Processor</role-name>
    </auth-constraint>      
</security-constraint>

现在组织单元“ProjectControlCenter”已添加到 LDAP 树结构中,如下所示:

dc=test,dc=de
|-- ou=applications
|    |-- ou=ProjectControlCenter
|    |    |-- ou=permissions
|    |    |    |-- cn=group.Project Processor.manage
|    |    |    |-- cn=group.Project Processor.read
|    |    |    |-- cn=group.Project Monitorer.read
|    |    |    |-- ...
|    |    |-- ou=resources
|    |    |    |-- cn=ProjectControlCenter.Applicaton
|    |    |    |-- cn=ProjectControlCenter.List
|    |    |    |-- cn=ProjectControlCenter.System
|    |    |    |-- ...
|-- ou=groups
|    |    |-- cn=Project Processor
|    |    |-- cn=Project Monitorer
|    |    |-- ...
|    |-- ou=users
|    |    |-- ou=UserGroupA
|    |    |    |-- uid=testA
|    |    |    |-- uid=testB
|    |    |    |-- uid=testC
|    |    |-- ou=UserGroupB
|    |    |-- ...

现在我不仅需要查询ou=groups,dc=test,dc=de 等角色,还需要查询所有ou=permissions,ou=ProjectControlCenter,ou=applications,dc=test,dc=de,其中分配的角色是其唯一成员,并将其添加到用户。 此外,还需要另一个查询来获取 ou=permissions,ou=ProjectControlCenter,ou=applications,dc=test,dc=de 是唯一成员的所有 ou=resources,ou=ProjectControlCenter,ou=applications,dc=test,dc=de,并将其添加到用户。

所以问题是:有没有办法通过LDAP配置递归查询某个用户的所有组,这些组的权限和资源的这些权限,或者我是否需要重载LdapLoginModule的createLdapInitContext(String username, Object credential)方法。类来实现所需的查询?

【问题讨论】:

【参考方案1】:

这是可能的,但只是在一定程度上。您的用例似乎很复杂,我个人会避免这种设计。不确定您是否已经检查过,但您的问题似乎与here 有关。

【讨论】:

以上是关于从多个 OU 中递归查询用户的 LDAP 角色的主要内容,如果未能解决你的问题,请参考以下文章

特定 OU 中子 OU 中所有用户的 LDAP 查询

LDAP 查询以返回包含给定用户的 OU

多个 OU 的 LDAP 身份验证配置

java ldap根据用户名查询

管理 ldap 中的特殊角色

带有子结果的 LDAP 查询