使用基于 memberOf 属性的 ldap 进行 Spring 安全认证

Posted

技术标签:

【中文标题】使用基于 memberOf 属性的 ldap 进行 Spring 安全认证【英文标题】:Spring security authentication using ldap based on memberOf attribute 【发布时间】:2014-01-31 01:43:33 【问题描述】:

我正在对 ldap 使用 spring 身份验证。如果提供的用户 id 和密码存在于 ldap 中,那么我能够获得用户登录。我想根据 LDAP 中用户的 memberOf 属性对此进行限制。如果用户的 memberOf 属性具有特定的 CN 值(CN=adminaccess 或 CN=superadminaccess),则身份验证/授权应该通过。否则身份验证/授权应该失败。

<security:http auto-config="true" use-expressions="true" access-denied-page="/admin/auth/denied">
    <security:intercept-url pattern="/admin/auth/login" access="permitAll" />
    <security:intercept-url pattern="/admin/dashboard/*" access="hasAnyRole('ROLE_ADMINACCESS','ROLE_SUPERADMINACCESS')"/>
</security:http>

<security:authentication-manager>   
  <security:ldap-authentication-provider   user-dn-pattern="CN=0,CN=Users" group-search-base="CN=adminaccess,CN=Users" />  
</security:authentication-manager>

<bean id="ldapContext"
        class="org.springframework.security.ldap.DefaultSpringSecurityContextSource">
    <constructor-arg value="ldap://xxx.ds.yyy.com:389/DC=xxx,DC=ds,DC=yyy,DC=com"/>
    <property name="userDn" value="CN=aaa,CN=Users,DC=xxx,DC=ds,DC=yyy,DC=com"/>
    <property name="password" value="thepassword"/>
</bean>

我总是使用上述配置进入拒绝访问页面。如果我从 security:intercept-url 中删除 access="hasAnyRole('ROLE_ADMINACCESS','ROLE_SUPERADMINACCESS')",我可以始终使用有效的用户/密码进行访问,即使用户不是 adminaccess 的一部分(我希望会受到限制,因为我的组 -search-base 指定了 CN=adminaccess)。 想知道应该是什么配置:

    将访问权限限制为 memberOf CN=adminaccess 和/或 CN=superadminaccess 的用户 指定正确的组搜索库。如果我只指定 CN=Users,我会超时,因为这违反了我们的公司 ldap。当我在 LDAP 浏览器上查找用户时,我找不到可以提供帮助的“ou”。使用我上面的配置 group-search-base="CN=adminaccess,CN=Users",我没有超时,但我认为它也不正确

【问题讨论】:

不确定 group-search-base 是否与 account-to-group 成员资格相关(即 memberOf 属性在帐户条目中)。 谢谢保罗。想知道是否有任何其他方式可以限制基于帐户到组成员身份的搜索。即使不属于这些组的用户的身份验证失败(不仅仅是授权),我也可以 可能使用用户的凭据来执行 LDAP 搜索他自己的帐户。然后,您也许可以使用 LDAP 过滤器,以便仅包含具有特定 memberOf 属性的帐户。然而,这可能需要手动 spring-security-ldap 配置(即没有命名空间支持)。 【参考方案1】:

不确定是否有更好的方法,但我能够使用 DefaultLdapAuthoritiesPopulator 成功完成这项工作并更新到以下配置:

<security:http auto-config="true" use-expressions="true" access-denied-page="/admin/auth/denied">
<security:intercept-url pattern="/admin/auth/login" access="permitAll" />
<security:intercept-url pattern="/admin/dashboard/*" access="hasAnyRole('ROLE_ADMINACCESS','ROLE_SUPERADMINACCESS')"/>
</security:http>

<security:authentication-manager>
    <security:authentication-provider
        ref="ldapAuthProvider"></security:authentication-provider>
</security:authentication-manager>

<bean id="ldapContext"
    class="org.springframework.security.ldap.DefaultSpringSecurityContextSource">
 <constructor-arg value="ldap://xxx.ds.yyy.com:389/DC=xxx,DC=ds,DC=yyy,DC=com"/>
 <property name="userDn" value="CN=aaa,CN=Users,DC=xxx,DC=ds,DC=yyy,DC=com"/>
 <property name="password" value="thepassword"/>
</bean>

<bean id="ldapAuthProvider"
     class="org.springframework.security.ldap.authentication.LdapAuthenticationProvider">
    <constructor-arg>
        <bean
            class="org.springframework.security.ldap.authentication.BindAuthenticator">
            <constructor-arg ref="ldapContext" />
            <property name="userDnPatterns">
                <list>
                    <value>CN=0,CN=Users</value>
                </list>
            </property>
        </bean>
    </constructor-arg>
    <constructor-arg>
        <bean
            class="org.springframework.security.ldap.userdetails.DefaultLdapAuthoritiesPopulator">
            <constructor-arg ref="ldapContext" />
            <constructor-arg value="CN=Users" />
            <property name="groupRoleAttribute" value="CN" />
        </bean>
    </constructor-arg>
</bean>

通过此配置,如果提供的登录用户名/密码正确,则用户为“memberOf”的所有组(模式CN=Users,DC=xxx,DC=ds,DC=yyy,DC=com),作为他的“角色”(以 ROLE_ 为前缀)加载,我可以使用 security:intercept-url 管理对这些角色的访问

【讨论】:

您是否从 SecurityContextHolder.getContext().getAuthentication() 对象获得 LDAP 组作为授予权限?我的权力总是空的,我正在努力实现与你完全相同的目标。谢谢

以上是关于使用基于 memberOf 属性的 ldap 进行 Spring 安全认证的主要内容,如果未能解决你的问题,请参考以下文章

如何将所有 memberOf 属性分配给 LDAP 中的特定用户

CentOS 6.5安装Openldap添加memberof属性

在spring security3中解析memberOf属性以获取组

Confluence 6 LDAP 成员结构设置

Spring Security - 在Spring Boot中针对LDAP使用Active Directory对用户进行身份验证

如何在春季测试 LDAP 安全配置?