【问题标题】:Spring Ldap - how to implement LdapAuthoritiesPopulatorSpring Ldap - 如何实现 LdapAuthoritiesPopulator
【发布时间】: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


【解决方案1】:

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

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

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

【讨论】:

  • 嗨,为了清楚起见,我添加了 ldap 结构。顺便说一句,我已经实现了 CustomAuthoritiesPopulator 类,但它没有被调用。我是否需要在 下面添加行 ???
  • 嗨,卢克,我刚刚意识到你是 spring ldapDefultAuthoritiesPopulator 的作者:docs.spring.io/autorepo/docs/spring-security/2.0.x/apidocs/org/… =)
猜你喜欢
  • 2014-09-27
  • 2015-12-21
  • 2011-03-06
  • 1970-01-01
  • 2012-02-19
  • 1970-01-01
  • 2018-01-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多