Spring Ldap - 如何实现LdapAuthoritiesPopulator

时间:2013-12-24 03:50:50

标签: java-ee spring-security spring-ldap

我正在开发一个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的用户将只能查看某些内容。他不能提交帖子等。他甚至被限制查看某些页面。

1 个答案:

答案 0 :(得分:0)

使用上面的内容,如果您只想将第二个constructor-arg(当前包含DefaultAuthoritiesPopulator)替换为;

<constructor-arg>
    <bean class="org.example.CustomAuthoritiesPopulator" />
</constructor-arg>

如果您需要解释如何编写课程(您的问题似乎暗示您已经这样做了),您需要提供您正在访问的目录结构的更多详细信息。