【问题标题】:Spring security authentication using LDAP使用 LDAP 的 Spring 安全认证
【发布时间】:2011-11-17 01:06:51
【问题描述】:

我是 spring security 的新手,我尝试运行基于 spring-security ldap 示例的示例应用程序。下面是我对 applicationContext-security.xml 的配置:

<http>
        <intercept-url pattern="/Login.jsp" filters="none"></intercept-url>
        <intercept-url pattern="/nnn/**" access="ROLE_ADMIN" />
        <intercept-url pattern="/common/**" access="ROLE_USER" />
        <form-login login-page="/Login.jsp" authentication-failure-url="/Login.jsp?login_error=1"
                    default-target-url="/common/home.jsp"/>
        <logout logout-success-url="/Login.jsp" invalidate-session="true"/>
    </http>

    <authentication-manager>
        <ldap-authentication-provider group-search-filter="member={0}"
            group-search-base="ou=groups"
            user-search-base="ou=people"
            user-search-filter="uid={0}" />
            <authentication-provider ref='secondLdapProvider' />
    </authentication-manager>

    <ldap-server ldif="classpath:users.ldif"  port="33389"/>

    <b:bean id="contextSource" class="org.springframework.security.ldap.DefaultSpringSecurityContextSource">
        <b:constructor-arg value="ldap://localhost:33389/dc=springframework,dc=org"/>
    </b:bean>

我已经按原样使用了 user.ldif 文件。 如果我使用默认值,应用程序将成功运行。但是,如果我在 ldif 文件和 applicationContext-security.xml 的 contextSource bean 中放置任何其他值来代替 springframework,比如 google,那么我会收到以下错误:

Your login attempt was not successful, try again.

Reason: [LDAP: error code 32 - NO_SUCH_OBJECT: failed for SearchRequest baseDn :
'2.5.4.11=people,0.9.2342.19200300.100.1.25=google,0.9.2342.19200300.100.1.25=org' filter : '(0.9.2342.19200300.100.1.1=rod)' scope :whole
subtree typesOnly : false Size Limit : no limit Time Limit : no limit Deref Aliases : deref Always attributes : : Cannot find a partition for
2.5.4.11=people,0.9.2342.19200300.100.1.25=google,0.9.2342.19200300.100.1.25=org:
org.apache.directory.shared.ldap.exception.LdapNameNotFoundException: Cannot find a partition for
2.5.4.11=people,0.9.2342.19200300.100.1.25=google,0.9.2342.19200300.100.1.25=org at
org.apache.directory.server.core.partition.DefaultPartitionNexus.getPartition(DefaultPartitionNexus.java:1082) at
org.apache.directory.server.core.partition.DefaultPartitionNexus.hasEntry(DefaultPartitionNexus.java:1037) at
org.apache.directory.server.core.interceptor.InterceptorChain$1.hasEntry(InterceptorChain.java:167) at 

谁能告诉我为什么会出现上述错误...


这是 ldif 文件:

dn: ou=groups,dc=google,dc=org
objectclass: top
objectclass: organizationalUnit
ou: groups

dn: ou=people,dc=google,dc=org
objectclass: top
objectclass: organizationalUnit
ou: people

dn: uid=rod,ou=people,dc=google,dc=org
objectclass: top
objectclass: person
objectclass: organizationalPerson
objectclass: inetOrgPerson
cn: Rod Johnson
sn: Johnson
uid: rod
userPassword: koala

dn: uid=dianne,ou=people,dc=google,dc=org
objectclass: top
objectclass: person
objectclass: organizationalPerson
objectclass: inetOrgPerson
cn: Dianne Emu
sn: Emu
uid: dianne
userPassword: emu

dn: uid=scott,ou=people,dc=google,dc=org
objectclass: top
objectclass: person
objectclass: organizationalPerson
objectclass: inetOrgPerson
cn: Scott
sn: Wombat
uid: scott
userPassword: wombat

dn: cn=user,ou=groups,dc=google,dc=org
objectclass: top
objectclass: groupOfNames
cn: user
member: uid=rod,ou=people,dc=google,dc=org
member: uid=dianne,ou=people,dc=google,dc=org
member: uid=scott,ou=people,dc=google,dc=org

dn: cn=teller,ou=groups,dc=google,dc=org
objectclass: top
objectclass: groupOfNames
cn: USER
member: uid=rod,ou=people,dc=google,dc=org
member: dianne=rod,ou=people,dc=google,dc=org

dn: cn=supervisor,ou=groups,dc=google,dc=org
objectclass: top
objectclass: groupOfNames
cn: ADMIN
member: uid=rod,ou=people,dc=google,dc=org

不是google,而是示例应用程序的原始文件中的springframework。我是不是错过了什么...

【问题讨论】:

    标签: ldap spring-security


    【解决方案1】:

    搜索请求必须至少包含基础对象、范围和过滤器。查询中指定的基础对象不存在,因此搜索失败。如您所见,错误代码 32 是“没有这样的对象”,在本例中是基础对象。

    【讨论】:

      【解决方案2】:

      您需要将 root 设置为所需的 base-dn/suffix(在您的情况下为 dc=google,dc=org)才能使其正常工作。因此,总的来说,您需要在三个地方进行更改:

      1. ldap-server 中的根目录
      2. 上下文源定义
      3. ldif 文件

      默认根是dc=springframework,dc=org,这就是为什么您不需要在您发布的示例中设置它。要使用任何其他基本 dn,请遵循以下示例 ldap-server 定义:

      <security:ldap-server id="dummyLdap" ldif="classpath:users.ldif" port="33389" root="dc=stackoverflow,dc=com">
      

      【讨论】:

        猜你喜欢
        • 2014-01-31
        • 2011-05-04
        • 1970-01-01
        • 2013-01-26
        • 1970-01-01
        • 2015-03-21
        • 2016-08-11
        • 1970-01-01
        • 2015-08-25
        相关资源
        最近更新 更多