我正在开发一个j2ee网页登录系统,该系统读取用户&来自ldap服务器的角色信息。对于身份验证,我使用绑定身份验证和简单的模式匹配。至于权威,因为ldap架构和目录相当复杂,我决定需要实现LdapAuthoritiesPopulator。但我在这里很失落,并希望有人能指出我正确的方向。
以下是示例spring bean配置中applicationContext-securityBeans.xml中的一些内容。如果我理解正确,我需要修改以下(它是applicationContext-securityBeans.xml的片段部分),但我不知道如何:
<constructor-arg>
<bean class="org.springframework.security.ldap.userdetails.DefaultAuthoritiesPopulator">
<constructor-arg ref="contextSource" />
<constructor-arg value="ou=Roles" />
<property name="groupRoleAttribute" value="ou" />
</bean>
</constructor-arg>
我还实现了customAuthoritiesPopulator.java,但我不知道如何插入它。
这是我的示例代码,我希望我能清楚地了解我的问题: 的web.xml
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext-securityBeans.xml</param-value>
的applicationContext-securityBeans.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:security="http://www.springframework.org/schema/security"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.1.xsd">
<security:http auto-config="true" use-expressions="true" access-denied-page="/user/denied" >
<security:form-login
login-page="/login"
authentication-failure-url="/login?error=true"
default-target-url="/admin/user"/>
<security:logout invalidate-session="true"
logout-success-url="/login"
logout-url="/j_spring_security_logout"/>
</security:http>
<security:authentication-manager>
<security:ldap-authentication-provider user-dn-pattern="uid={0},ou=Users" />
</security:authentication-manager>
<bean id="contextSource" class="org.springframework.security.ldap.DefaultSpringSecurityContextSource">
<constructor-arg value="ldap://20.6.1.27:389/dc=openLDAP" />
<property name="userDn" value="cn=admin,dc=openLDAP" />
<property name="password" value="password" />
</bean>
<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=Users</value>
</list>
</property>
</bean>
</constructor-arg>
<constructor-arg>
<bean class="org.springframework.security.ldap.userdetails.DefaultAuthoritiesPopulator">
<constructor-arg ref="contextSource" />
<constructor-arg value="ou=Roles" />
<property name="groupRoleAttribute" value="ou" />
</bean>
</constructor-arg>
</bean>
</beans>
CustomAuthoritiesPopulator.java
package org.example.impl;
import java.util.ArrayList;
import java.util.List;
import org.springframework.ldap.core.DirContextOperations;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.ldap.userdetails.LdapAuthoritiesPopulator;
public class CustomAuthoritiesPopulator implements LdapAuthoritiesPopulator {
@Override
public List<GrantedAuthority> getGrantedAuthorities(
DirContextOperations aUserData,
String aUsername) {
System.out.println("in getGrantedAuthorities");
List<GrantedAuthority> userPermission = new ArrayList<>();
return userPermission;
}
}
=============================================== ========================
Ldap结构:
DIT
|
|--Root DSE
|
|--dc=apacheLDAP
| |
| |--ou=Rights
| | |
| | |--right=1
| | |--right=2
| | |--right=3
| |--ou=Roles
| | |
| | |--role=1
| | |--role=2
| | |--role=3
| | |--role=4
| |
| |--ou=Users
| | |
| | |--user=ali
| | |--user=john
| | |--user=bettyboop
|
|--ou=system
|
|uid=admin
假设右1 =管理员,右2 =用户,右3 =客人
假设角色1 = itpeople,角色2 = hr,角色3 =销售,角色4 = ceo
假设权利1分配给角色1和角色4,右2分配给角色2,右3分配给角色3
可以为每个角色分配权利。如果角色具有权限1,并且此角色已分配给用户,则此用户将具有管理权限。
当用户登录时,我想要检索该用户所属的角色,以及他拥有的权利。
当用户浏览网页时,我将通过检查他的角色和权限来验证对该页面的访问。
我还会检查他是否有权提交帖子或查看某个页面中的某些内容。例如,具有权限3(访客)的角色3的用户将只能查看某些内容。他不能提交帖子等。他甚至被限制查看某些页面。
答案 0 :(得分:0)
使用上面的内容,如果您只想将第二个constructor-arg
(当前包含DefaultAuthoritiesPopulator
)替换为;
<constructor-arg>
<bean class="org.example.CustomAuthoritiesPopulator" />
</constructor-arg>
如果您需要解释如何编写课程(您的问题似乎暗示您已经这样做了),您需要提供您正在访问的目录结构的更多详细信息。