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

Spring security 基于memberOf属性的使用ldap的Spring安全认证,spring-security,spring-ldap,role-base-authorization,memberof,Spring Security,Spring Ldap,Role Base Authorization,Memberof,我正在对ldap使用spring身份验证。如果ldap中存在提供的用户id和密码,那么我就能够获得用户登录名。我想根据LDAP中用户的memberOf属性来限制这一点。如果用户具有具有特定CN值(CN=adminaccess或CN=superadminaccess)的memberOf属性,则身份验证/授权应通过。否则身份验证/授权应失败 <security:http auto-config="true" use-expressions="true" access-denied-page="

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

<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\u admincess','ROLE\u SUPERADMINACCESS'),我就能够始终使用有效的用户/密码进行访问,即使用户不是admincess的一部分(我希望这会受到限制,因为我的组搜索库指定了CN=admincess)。 想知道配置应该是什么:

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

  • 不确定是否有更好的方法,但我使用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>
    
    
    CN={0},CN=用户
    

    使用此配置,如果提供的登录用户名/密码正确,则用户为“memberOf”(模式CN=Users,DC=xxx,DC=ds,DC=yyy,DC=com)的所有组都将加载为他的“角色”(前缀为ROLE_2;)我能够使用安全性管理对这些角色的访问:拦截url

    我不确定
    组搜索库
    是否与帐户到组成员身份相关(即帐户条目上的
    memberOf
    属性)。谢谢。想知道是否有任何其他方法可以限制我的搜索为基础的帐户组成员。即使对不属于这些组的用户的身份验证失败(而不仅仅是授权),我也可以使用用户的凭据对其自己的帐户执行LDAP搜索。然后,您可能可以使用LDAP筛选器,以便只包含具有特定
    memberOf
    属性的帐户。但是,这可能需要手动spring security ldap配置(即不支持命名空间)。您是否从SecurityContextHolder.getContext().getAuthentication()对象获得ldap组作为授权?我的权威总是空荡荡的,我正努力实现和你们一样的目标。谢谢