【发布时间】:2014-08-13 09:43:46
【问题描述】:
如何尽可能使用 Spring Security/LDAP 解决以下 LDAP 认证情况。
用户属于 2 个 LDAP 组织单位之一 (ou):客户或员工
用户属于 3 个访问组之一 (cn - groupofuniquenames) 或其子组 (cn)
所以基本上是这样的:
在 LDAP 中查找用户的 DN(客户或员工)
绑定用户检查密码
逐一搜索所有 3 个访问组及其子组,以查找具有用户 DN 的 uniquename 属性。
我查看了各种教程和示例,但似乎没有一个相关,我无法将它们组合起来。如果访问组是一个组织单位会更容易,但事实并非如此。
整个页面及其所有 servlet 都应该在身份验证之后。
问题有点具体,但希望对社区有用。欢迎任何想法或建议。
我目前使用的代码是spring文档的修改版本。
<bean id="roleVoter" class="org.springframework.security.access.vote.RoleVoter">
<property name="rolePrefix" value=""></property>
</bean>
<bean id="accessDecisionManager" class="org.springframework.security.access.vote.AffirmativeBased">
<constructor-arg name="decisionVoters" ref="roleVoter" />
</bean>
<security:http authentication-manager-ref="ldap-auth" access-decision-manager-ref="accessDecisionManager">
<security:intercept-url pattern="/site/**" access="LDAP-Access-Group" />
<security:form-login
login-page="/login"
authentication-failure-url="/denied"
username-parameter="username"
password-parameter="password"
default-target-url="/site/main" />
<security:logout
invalidate-session="true"
logout-success-url="/login"
logout-url="/j_spring_security_logout" />
<security:access-denied-handler error-page="/denied" />
<security:session-management invalid-session-url="/login">
<security:concurrency-control max-sessions="1" expired-url="/login" />
</security:session-management>
</security:http>
<bean id="contextSource" class="org.springframework.security.ldap.DefaultSpringSecurityContextSource">
<constructor-arg value="ldap://server:389/o=company,c=com"/>
</bean>
<security:authentication-manager id="ldap-auth">
<security:authentication-provider ref="ldapAuthProvider" />
</security:authentication-manager>
<bean id="ldapAuthProvider" class="org.springframework.security.ldap.authentication.LdapAuthenticationProvider">
<constructor-arg>
<bean class="org.springframework.security.ldap.authentication.BindAuthenticator">
<constructor-arg ref="contextSource"/>
<property name="userDnPatterns">
<list>
<value>uid={0},ou=Employees</value>
<value>uid={0},ou=Clients</value>
</list>
</property>
</bean>
</constructor-arg>
<constructor-arg>
<bean class="org.springframework.security.ldap.userdetails.DefaultLdapAuthoritiesPopulator">
<constructor-arg ref="contextSource"/>
<constructor-arg value="ou=Access"/>
<property name="searchSubtree" value="true"/>
<property name="groupRoleAttribute" value="cn" />
</bean>
</constructor-arg>
</bean>
上面的代码似乎没有返回权限。有没有办法将输出发送到调试控制台?无法读取 LDAP 日志。
另外,如果我注释掉 AuthoritiesPopulator,那么在检查安全标签(即<sec:authorize access="isAuthenticated()">logged in</sec:authorize>)时,身份验证似乎有效,但由于某种原因,intercept-url 阻止我使用<security:intercept-url pattern="/site/**" access="isAuthenticated()" /> 进入站点。没看懂。
【问题讨论】:
-
我认为您的意思是用户位于两个 LDAP 容器 之一(ou 通常是一个容器)。另外,您的 LDAP 服务器是 Active Directory 吗?
-
@mvreijn 这不是广告。
标签: java spring authentication spring-security ldap