2010-09-24 25 views
5

Kurduğum yerel bir ADAM örneğiyle konuşmak için spring-security kullanarak bir Java uygulaması almaya çalışıyorum.Bahar güvenliğini kullanarak ADAM ile LDAP kullanarak kimlik doğrulaması

şöyle başarıyla ADAM ve kurulumu yüklediniz

.... localhost üzerinde çalışan

  • Örnek: 389
  • Kök O=Company
    • olduğunu OU=Company Users (orgnizationalUnit) adlı bir çocuk
      • CN=Mike Q (kullanıcı)
      • adı verilen bir granchild 10 ve

password = welcome Sonra kurulum yay güvenlik (versiyon 3.0.3, yay çerçeve 3.0.4 ve yaylı-ldap 1.3.0) var. Bahar dosya

<security:ldap-server id="contextSource" url="ldap://localhost:389/o=Company"/> 

    <security:authentication-manager> 
    <security:ldap-authentication-provider user-dn-pattern="uid={0},ou=Company Users"/> 
    </security:authentication-manager> 

    <bean class="com.xxx.test.TestAuthentication" lazy-init="false"/> 

Ve TestAuthentication

public class TestAuthentication 
{ 
    @Autowired 
    private AuthenticationManager authenticationManager; 

    public void initialise() 
    { 
     Authentication authentication = new UsernamePasswordAuthenticationToken("mike", "welcome"); 
     Authentication reponseAuthentication = authenticationManager.authenticate(authentication); 
    } 
} 

bu Koşu Birisi yanlış nereye gidiyorum işaret olsaydı memnun olurum aşağıdaki hatayı

Caused by: javax.naming.AuthenticationException: [LDAP: error code 49 - 8009030C: LdapErr: DSID-0C090336, comment: AcceptSecurityContext error, data 2030, vece] 
at com.sun.jndi.ldap.LdapCtx.mapErrorCode(LdapCtx.java:3041) 
at com.sun.jndi.ldap.LdapCtx.processReturnCode(LdapCtx.java:2987) 
at com.sun.jndi.ldap.LdapCtx.processReturnCode(LdapCtx.java:2789) 
at com.sun.jndi.ldap.LdapCtx.connect(LdapCtx.java:2703) 
at com.sun.jndi.ldap.LdapCtx.<init>(LdapCtx.java:293) 
at com.sun.jndi.ldap.LdapCtxFactory.getUsingURL(LdapCtxFactory.java:175) 
at com.sun.jndi.ldap.LdapCtxFactory.getUsingURLs(LdapCtxFactory.java:193) 
at com.sun.jndi.ldap.LdapCtxFactory.getLdapCtxInstance(LdapCtxFactory.java:136) 
at com.sun.jndi.ldap.LdapCtxFactory.getInitialContext(LdapCtxFactory.java:66) 
at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:667) 
at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:288) 
at javax.naming.InitialContext.init(InitialContext.java:223) 
at javax.naming.ldap.InitialLdapContext.<init>(InitialLdapContext.java:134) 
at org.springframework.ldap.core.support.LdapContextSource.getDirContextInstance(LdapContextSource.java:43) 
at org.springframework.ldap.core.support.AbstractContextSource.createContext(AbstractContextSource.java:254) 

olsun. Bu noktada sadece girilen bir kullanıcı/şifrenin LDAP kullanarak kimliğini doğrulamak istiyorum, bundan daha karmaşık bir şey değil.

Ayrıca, LDAP dünyasına ilk adım attığımdan bazı genel noktalara da ilgi duyuyorum.

  • LDAP büyük/küçük harfe duyarlı mı?
  • Boşluklardan en iyi şekilde kaçınılı mı?
  • LDAP sorgusunda şifreyi açık metin olarak göndermekten kaçınmak için genel kullanım durumları/en iyi yöntemler nelerdir?

cevap

4

Tamam, ben bunu çözmek için bolca zaman harcadım gibi cevap burada.

Hata kodu 2030, kullanıcının DN'sinin geçersiz olduğu anlamına gelir.

Denemeden ve hatadan sonra, kullanıcı düzgün bir şekilde çalışıp çalışan bir yapılandırmadır. (Bunu muhtemelen güvenlik ad alanını kullanarak yeniden yazabilirsiniz, ancak bunun üzerinde çalışırken ham fasulye tanımlarını kullanmak daha açıktı).

<bean id="contextSource" 
     class="org.springframework.security.ldap.DefaultSpringSecurityContextSource"> 
    <constructor-arg value="ldap://localhost:389/cn=Sandbox,dc=ITOrg"/> 
    <property name="userDn" value="cn=superuser,cn=People,cn=Sandbox,dc=ITOrg"/> 
    <property name="password" value="xxxxxx"/> 
    </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>cn={0},cn=People</value> 
      </list> 
     </property> 
     </bean> 
    </constructor-arg> 
    </bean> 

    <bean id="userSearch" class="org.springframework.security.ldap.search.FilterBasedLdapUserSearch"> 
    <constructor-arg index="0" value="cn=People"/> 
    <constructor-arg index="1" value="(cn={0})"/> 
    <constructor-arg index="2" ref="contextSource"/> 
    </bean> 

önemli nokta

<property name="userDn" value="cn=superuser,cn=People,cn=Sandbox,dc=ITOrg"/> 

bağlam kaynağı o (TAM DN olmalıdır sadece bu url verilen tabanını yapmak append değil de KullanıcıDN belirterek

(kurucu arg vardır).

BindAuthentication

<value>cn={0},cn=People</value> 

Bu değer, ile bağlam kaynağının TemelDN üstünde bir ekidir.

bir UserSearch yapılandırılması

<constructor-arg index="0" value="cn=People"/> 
    <constructor-arg index="1" value="(cn={0})"/> 

Ben cn=People ikinci arg olmak ama bu iyi iş gibi görünüyor çalışmak için alamadım. Kullanıcının özelliklerini kullanabilirsiniz. Burada

Ve (uid={0})

@Autowired 
    private LdapUserSearch ldapUserSearch; 

    @Autowired 
    private AuthenticationProvider authenticationProvider; 

    public void initialise() 
    { 
     DirContextOperations dirContextOperations = ldapUserSearch.searchForUser("username"); 

     Authentication authentication = authenticationProvider.authenticate(new UsernamePasswordAuthenticationToken("username", "password"));  
    } 

diğer bazı rasgele titbits ...

Error 52b - Invalid password 


[LDAP: error code 32 - 0000208D: NameErr: DSID-031521D2, problem 2001 (NO_OBJECT), data 0, best match of: 'CN=Sandbox,DC=ITOrg' 
    - This means the user is not in the administrator role (probably) 

Umut tüm bu başkası yardımcı olur ... fasulye tanımlarını kullanarak bazı örnek kod.

0

Bu sorunu, aynı Base DN'de yönetici rolünün üyesi olarak kullanmaya çalıştığınız kullanıcıyı ekleyerek düzelttim. Umut bu yardımcı olur

İlgili konular