我正在对 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",我没有超时,但我认为它也不正确