【发布时间】:2013-12-27 17:14:00
【问题描述】:
我正在开发一个从 ldap 服务器读取用户和角色信息的 j2ee 网页登录系统。对于身份验证,我使用具有简单模式匹配的绑定身份验证。至于权限,因为 ldap 模式和目录相当复杂,我决定我需要实现 LdapAuthoritiesPopulator。但我在这里很迷茫,希望有人能指出我正确的方向。
以下是示例 spring bean 配置中 applicationContext-securityBeans.xml 中的一些内容。如果我理解正确,我需要修改以下内容(它是 applicationContext-securityBeans.xml 中的 sn-p 部分)但我不知道如何:
<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
假设 right 1=admin,right 2=user,right 3=guest
担任角色 1=itpeople,角色 2=hr,角色 3=销售,角色 4=ceo
假设权利 1 分配给角色 1 和角色 4,权利 2 分配给角色 2,权利 3 分配给角色 3
可以为每个角色分配一个权限。如果一个角色有权限 1,并且这个角色被分配给一个用户,这个用户将拥有管理权限。
当用户登录时,我想检索该用户所属的角色,以及他拥有的权限。
当用户浏览网页时,我将通过检查他的角色和权限来验证对页面的访问。
我还将检查他是否有权提交帖子或查看页面中的某些内容。因此,例如,具有权限 3(访客)的角色 3 的用户将只能查看某些内容。他不能提交帖子等。他甚至被限制查看某些页面。
【问题讨论】:
-
我进一步阐述了角色和权利的关系
标签: jakarta-ee spring-security spring-ldap