【问题标题】:How to map Ldap groups to Tomcat Roles (Java)如何将 Ldap 组映射到 Tomcat 角色 (Java)
【发布时间】:2016-05-16 16:11:26
【问题描述】:

我正在使用 Servlets/JSP 等编写一个 Web 项目。目前该程序使用基本身份验证来确保安全性。但我的工作希望从我们的活动目录中获取安全角色。

我修改了 apache 的 server.xml 如下:

<Realm className="org.apache.catalina.realm.JNDIRealm" debug="99"
       connectionURL="ldap://adclds001.mycompgroup.local:389"
       connectionName="************.local:389"
       connectionPassword="********"
       userPattern="CN={0},OU=Trainers, OU=Academy, OU=Staff, OU=Users, OU=UK, OU=Countries, DC=mycompgroup, DC=local"
       roleBase="OU=Trainers, OU=Academy, OU=Staff, OU=Users, OU=UK, OU=Countries, DC=mycompgroup, DC=local"
       roleName="cn"
       roleSearch="member={0}"
     />

身份验证工作正常,但我不知道如何映射 ldap 组 到 Tomcat 角色。

我尝试将组名之类的内容添加到 部署描述符的条目,但无济于事。

我还听说扩展 JNDIRealm 类并覆盖 getRoles 方法可能会给我我想要的东西..但我找不到完整的 可能需要的详细信息。

那么将 ldap 组映射到 tomcat 角色的最佳方法是什么?

应用程序仍然没有扮演角色。

我的领域详情目前是:

<Realm className="org.apache.catalina.realm.JNDIRealm" debug="99"
       connectionURL="ldap://adclds001.mycomp.local:389"
       connectionName="trainee1@mycomp.local:389"
       connectionPassword="****"
       userPattern="CN={0},OU=Trainers, OU=Academy, OU=Staff, OU=Users, OU=UK, OU=Countries, DC=mycompgroup, DC=local"
       userRoleName="Domain Users"
       roleBase="OU=Trainers, OU=Academy, OU=Staff, OU=Users, OU=UK, OU=Countries, DC=mycompgroup, DC=local"
       roleName="cn"
       roleSearch="member={0}"
     />

我的部署描述符中有一个安全约束:

    <security-constraint>
        <web-resource-collection>
            <web-resource-name>Wildcard means whole app requires authentication</web-resource-name>
            <url-pattern>/*</url-pattern>
            <http-method>GET</http-method>
            <http-method>POST</http-method>
        </web-resource-collection>
        <auth-constraint>
            <role-name>Domain Users</role-name>
            <role-name>admin_user</role-name>
        </auth-constraint>
        <user-data-constraint>
            <transport-guarantee>NONE</transport-guarantee>
        </user-data-constraint>
    </security-constraint>   

web.xml 中的安全角色:

    <security-role>
        <role-name>basic_user</role-name>
    </security-role>
    <security-role>
        <role-name>admin_user</role-name>
    </security-role>

    <security-role>
        <role-name>Domain Users</role-name>
    </security-role>

我也有:

<login-config>
    <auth-method>BASIC</auth-method>
</login-config>

还有

我的 IT 部门告诉我,每个人都属于以下组: CN=域用户,CN=Users,DC=mycompgroup,DC=local

谁能建议我为什么不能使用域用户角色?

【问题讨论】:

  • 你能包含一个样本组吗?查看 Tomcat 文档,它似乎应该可以工作。您使用的是哪个版本的 Tomcat?

标签: java tomcat ldap


【解决方案1】:

您可以使用 LDAPAdminExe 浏览 ldap 结构。并找到您所在的“组”。

例如,您的群组是CN=Domain Users,CN=Users,DC=mycompgroup,DC=local

步骤 1。您应该在角色库中检查该组(使用 LDAPAdminExe 进行检查):

OU=Trainers, OU=Academy, OU=Staff, OU=Users, OU=UK, OU=Countries, DC=mycompgroup, DC=local

如果不是,您应该更改此 roleBase 设置。我认为它可能可以将此配置设置为

DC=mycompgroup,DC=local

所以你将在 server.xml 中设置配置:

<Realm className="org.apache.catalina.realm.JNDIRealm" debug="99"
       connectionURL="ldap://adclds001.mycomp.local:389"
       connectionName="trainee1@mycomp.local:389"
       connectionPassword="****"
       userPattern="CN={0},OU=Trainers, OU=Academy, OU=Staff, OU=Users, OU=UK, OU=Countries, DC=mycompgroup, DC=local"
       userRoleName="Domain Users"
       roleBase="DC=mycompgroup,DC=local"
       roleName="cn"
       roleSearch="member={0}"
     />

第 2 步。您应该在 web.xml 中添加组名称:

<security-constraint>
....
    <auth-constraint>
        <role-name>Domain Users</role-name>
    </auth-constraint>
</security-constraint>

<login-config>
    <auth-method>BASIC</auth-method>
</login-config>

<security-role>
    <role-name>Domain Users</role-name>
</security-role>

步骤 3. 重启这个 tomcat 服务器

好好享受吧!!!

【讨论】:

    【解决方案2】:

    这里是 a description of subclassing JNDIRealm 用于这些目的。他建议使用属性文件。

    我做了类似的事情,但是,我允许通过 Realm 元素中的属性添加条目。为此,请在您的子类中创建一个 JavaBean 属性,例如rolesForServer。给定“event_requester”、“approver”、“manager”的应用程序角色,setRolesForServer 可以解析字符串,例如rolesForServer='HR=approver,manager;all=event_requester'.

    【讨论】:

      【解决方案3】:

      你已经完成了第一步。

      然后您需要将“security-constraint”添加到您的应用程序的上下文中。 (通常是 web.xml 文件)。

      simple example can be found here

      【讨论】:

        【解决方案4】:

        你已经做到了。当用户登录时,他所在的所有角色的 CN 将自动与该用户关联。没有什么可做的了。

        【讨论】:

        • 应用程序仍然没有扮演角色。
        猜你喜欢
        • 1970-01-01
        • 2018-11-15
        • 2021-07-25
        • 2017-07-27
        • 1970-01-01
        • 2020-03-16
        • 2015-03-04
        • 1970-01-01
        • 2018-12-02
        相关资源
        最近更新 更多