2012-05-16 6 views
8
de NullPointerException atar

ben xml dosyasında tanımlanan Bahar Güvenlik LDAP kimlik doğrulaması kullanılan ve iyi çalıştı: LdapAuthenticationProvider AbstractContextSource.getReadOnlyContext

<security:authentication-manager> 
    <security:ldap-authentication-provider 
     user-search-filter="(uid={0})" 
     user-search-base="dc=company,dc=com"> 
    </security:ldap-authentication-provider> 
</security:authentication-manager> 

<security:ldap-server url="ldap://mail.company.com" /> 

Ben doğrulayıcı sağlayıcısına bazı mantık eklemek için gerekli (Birini isim veritabanına giriş)

xml yapılandırma:

<security:authentication-manager> 
    <security:authentication-provider ref="appAuthenticationProvider" /> 
</security:authentication-manager> 
yüzden DaoAuthenticationProvider LDAP kullanması için uygulanan

sınıf uygulaması: şöyle birinci durumda

java.lang.NullPointerException 
org.springframework.ldap.core.support.AbstractContextSource.getReadOnlyContext(AbstractContextSource.java:125) 
org.springframework.ldap.core.LdapTemplate.executeReadOnly(LdapTemplate.java:792) 
org.springframework.security.ldap.SpringSecurityLdapTemplate.searchForSingleEntry(SpringSecurityLdapTemplate.java:196) 
org.springframework.security.ldap.search.FilterBasedLdapUserSearch.searchForUser(FilterBasedLdapUserSearch.java:116) 
org.springframework.security.ldap.authentication.BindAuthenticator.authenticate(BindAuthenticator.java:90) 
org.springframework.security.ldap.authentication.LdapAuthenticationProvider.doAuthentication(LdapAuthenticationProvider.java:178) 
org.springframework.security.ldap.authentication.AbstractLdapAuthenticationProvider.authenticate(AbstractLdapAuthenticationProvider.java:61) 
myapp.security.AppAuthenticationProvider.authenticate(AppAuthenticationProvider.java:69) 

Kayıtlar:

@Service("appAuthenticationProvider") 
public class AppAuthenticationProvider extends DaoAuthenticationProvider { 

    private LdapAuthenticationProvider ldapProvider; 

    public AppAuthenticationProvider(){ 
     DefaultSpringSecurityContextSource contextSource = new DefaultSpringSecurityContextSource("ldap://mail.company.com"); 
     BindAuthenticator authenticator = new BindAuthenticator(contextSource); 
     authenticator.setUserSearch(new FilterBasedLdapUserSearch("dc=company,dc=com", "(uid={0})", contextSource)); 
     ldapProvider = new LdapAuthenticationProvider(authenticator); 
    } 

    public Authentication authenticate(Authentication authRequest) throws AuthenticationException { 
     return ldapProvider.authenticate(authRequest); 
    } 

} 

Size ilk uygulanmasından bekliyoruz ama yöntem haricinde aşağıdaki atar kimlik doğrulaması yapardım qute görünüyor

[myapp] 2012-05-16 11:38:44,339 INFO org.springframework.security.ldap.DefaultSpringSecurityContextSource - URL 'ldap://mail.company.com', root DN is '' 
[myapp] 2012-05-16 11:38:44,364 INFO org.springframework.security.ldap.DefaultSpringSecurityContextSource - URL 'ldap://mail.company.com', root DN is '' 
[myapp] 2012-05-16 11:38:44,365 DEBUG org.springframework.ldap.core.support.AbstractContextSource - AuthenticationSource not set - using default implementation 
[myapp] 2012-05-16 11:38:44,365 INFO org.springframework.ldap.core.support.AbstractContextSource - Property 'userDn' not set - anonymous context will be used for read-write operations 
[myapp] 2012-05-16 11:38:44,365 DEBUG org.springframework.ldap.core.support.AbstractContextSource - Using LDAP pooling. 
[myapp] 2012-05-16 11:38:44,365 DEBUG org.springframework.ldap.core.support.AbstractContextSource - Trying provider Urls: ldap://mail.company.com 
[myapp] 2012-05-16 11:38:44,369 INFO org.springframework.security.ldap.userdetails.DefaultLdapAuthoritiesPopulator - groupSearchBase is empty. Searches will be performed from the context source base 
[myapp] 2012-05-16 11:39:33,956 DEBUG org.springframework.security.authentication.ProviderManager - Authentication attempt using org.springframework.security.ldap.authentication.LdapAuthenticationProvider 
[myapp] 2012-05-16 11:39:33,957 DEBUG org.springframework.security.ldap.authentication.LdapAuthenticationProvider - Processing authentication request for user: JohnDoe 
[myapp] 2012-05-16 11:39:33,960 DEBUG org.springframework.security.ldap.search.FilterBasedLdapUserSearch - Searching for user 'JohnDoe', with user search [ searchFilter: '(uid={0})', searchBase: 'dc=company,dc=com', scope: subtree, searchTimeLimit: 0, derefLinkFlag: false ] 
[myapp] 2012-05-16 11:39:34,812 DEBUG org.springframework.ldap.core.support.AbstractContextSource - Got Ldap context on server 'ldap://mail.company.com' 
[myapp] 2012-05-16 11:39:35,025 DEBUG org.springframework.security.ldap.SpringSecurityLdapTemplate - Searching for entry under DN '', base = 'dc=company,dc=com', filter = '(uid={0})' 
[myapp] 2012-05-16 11:39:35,060 DEBUG org.springframework.security.ldap.SpringSecurityLdapTemplate - Found DN: cn=JohnDoe,cn=users,dc=company,dc=com 
[myapp] 2012-05-16 11:39:35,082 DEBUG org.springframework.security.ldap.authentication.BindAuthenticator - Attempting to bind as cn=JohnDoe,cn=users,dc=company,dc=com 

İkinci durumda:

[myapp] 2012-05-16 11:34:13,563 INFO org.springframework.security.ldap.DefaultSpringSecurityContextSource - URL 'ldap://mail.company.com', root DN is '' 
[myapp] 2012-05-16 11:34:28,363 INFO org.springframework.security.ldap.DefaultSpringSecurityContextSource - URL 'ldap://mail.company.com', root DN is '' 
[myapp] 2012-05-16 11:34:37,194 DEBUG org.springframework.security.authentication.ProviderManager - Authentication attempt using myapp.security.AppAuthenticationProvider 
[myapp] 2012-05-16 11:34:37,197 DEBUG org.springframework.security.ldap.authentication.LdapAuthenticationProvider - Processing authentication request for user: JohnDoe 
[myapp] 2012-05-16 11:34:37,197 DEBUG org.springframework.security.ldap.search.FilterBasedLdapUserSearch - Searching for user 'JohnDoe', with user search [ searchFilter: '(uid={0})', searchBase: 'dc=company,dc=com', scope: subtree, searchTimeLimit: 0, derefLinkFlag: false ] 

Herhangi bir fikrin var mı?

cevap

18

DefaultSpringSecurityContextSource'u ("yeni" kullanarak el ile oluşturduğunuzdan) tam olarak başlatılamıyorsunuz.

yaratılış altında bu ekleyin ve sonra tamamen hazır olması gerekir:

[myapp] 2012-05-16 11:38:44,365 INFO org.springframework.ldap.core.support.AbstractContextSource - Property 'userDn' not set - anonymous context will be used for read-write operations 

Eğer el ile oluşturulan kullanmayı deneyin: Bu özel durumda

contextSource.afterPropertiesSet(); 

, bu hat anahtarıdır (ancak düzgün bir şekilde başlatılamamıştır) içerik kaynağı, salt okunur işlemlere anonim erişime izin vermeyen varsayılan davranışla devam eder. Herhangi bir yönetici dn/şifresi belirttiğiniz için, bir NPE ile başarısız olur. Düzgün olarak örneği (afterPropertiesSet() numaralı telefonu arayarak) başlatarak, kullanıcı/pwd belirtilmemiş olduğundan salt okunur için anonim erişim kullanacak şekilde ayarlayacaktır.

+0

Çalışıyor! Çok teşekkürler. Birkaç sinir bozucu saat geçirdim, bana bir kaç tane daha kaydettiniz;) Spring Secuirty belgeleri veya hata mesajları daha pratik bilgiler sunabilir. –

+0

Bu çözümü bulmak için iki günlük çalışma çok teşekkürler –

+0

Yay güvenlik çekirdekli Grails 3.2.9'daki çalışmalar: 3.1.2 ve spring-security-ldap: 3.0.2. Herhangi bir nedenle application.yml ayarı grails.plugin.springsecurity.ldap.context.anonymousReadOnly: true göz ardı ediliyordu. afterPropertiesSet() düzeltildi. –