小编Bad*_*itt的帖子

LdapAuthenticationProvider在AbstractContextSource.getReadOnlyContext中抛出NullPointerException

我使用了在xml文件中定义的Spring Security LDAP身份验证,它工作正常:

<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" />
Run Code Online (Sandbox Code Playgroud)

我需要在authenticator提供程序中插入一些逻辑(登录数据库来命名),所以我实现了DaoAuthenticationProvider来使用LDAP:

xml配置:

<security:authentication-manager>
    <security:authentication-provider ref="appAuthenticationProvider" />
</security:authentication-manager>
Run Code Online (Sandbox Code Playgroud)

类实现:

@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);
    }

}
Run Code Online (Sandbox Code Playgroud)

它看起来好像你对第一个实现的期望,但authenticate方法抛出以下异常:

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)
Run Code Online (Sandbox Code Playgroud)

登录第一个案例如下所示:

[myapp] 2012-05-16 11:38:44,339 INFO  org.springframework.security.ldap.DefaultSpringSecurityContextSource -  URL …
Run Code Online (Sandbox Code Playgroud)

security spring ldap spring-security

13
推荐指数
1
解决办法
9626
查看次数

标签 统计

ldap ×1

security ×1

spring ×1

spring-security ×1