2011-09-14 121 views
1

我是Spring安全新手,我試着運行一個基於spring-security ldap示例的示例應用程序。下面是我的配置applicationContext-security.xml:使用LDAP進行Spring安全認證

<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文件,因爲它是。 如果使用默認值,應用程序將成功運行。但是,如果我把其他任何值到位springframework的,比方說谷歌,在ldif文件,並在ApplicationContext中-security.xml文件的好的ContextSource豆,然後我得到下面的錯誤:

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 

而是谷歌的,這是springframework的從樣品APPLIC原始文件通貨膨脹。我是否錯過了...

回答

0

搜索請求必須至少包含基礎對象,範圍和過濾器。查詢中指定的基礎對象不存在,因此搜索失敗。正如你所看到的,錯誤代碼32是'沒有這樣的對象',在這種情況下是基礎對象。

1

您需要將root設置爲所需的base-dn/suffix(dc = google,dc = org,在您的情況下)以使其運行。所以,在所有的,有些情況下你需要改變三個地方:

  1. 在LDAP服務器
  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">