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

时间:2014-01-12 07:07:50

标签: spring-security spring-ldap role-base-authorization memberof

我正在使用针对ldap的spring身份验证。如果在ldap中存在提供的用户标识和密码,那么我就能够获得用户登录。我想根据LDAP中用户的memberOf属性来限制它。如果用户具有具有特定CN值的memberOf属性(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>

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

  1. 限制只访问成员CN = adminaccess和/或CN = superadminaccess的用户
  2. 指定正确的group-search-base。如果我只指定CN = Users,那么我会收到超时,因为这违反了我们的公司ldap。当我在LDAP浏览器上查找用户时,我找不到可以帮助的“ou”。使用我上面的配置group-search-base =“CN = adminaccess,CN = Users”,我没有超时,但我不认为这是正确的

1 个答案:

答案 0 :(得分: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