【问题标题】:spring ldap security without xml没有xml的spring ldap安全
【发布时间】:2014-06-14 05:13:42
【问题描述】:

本文档解释了如何配置 Spring-Security LDAP:

http://docs.spring.io/spring-security/site/docs/3.2.4.CI-SNAPSHOT/reference/htmlsingle/#ldap

3.4.5. Spring Bean Configuration

<bean id="contextSource"
        class="org.springframework.security.ldap.DefaultSpringSecurityContextSource">
  <constructor-arg value="ldap://monkeymachine:389/dc=springframework,dc=org"/>
  <property name="userDn" value="cn=manager,dc=springframework,dc=org"/>
  <property name="password" value="password"/>
</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>uid={0},ou=people</value></list>
     </property>
   </bean>
 </constructor-arg>
 <constructor-arg>
   <bean
     class="org.springframework.security.ldap.userdetails.DefaultLdapAuthoritiesPopulator">
     <constructor-arg ref="contextSource"/>
     <constructor-arg value="ou=groups"/>
     <property name="groupRoleAttribute" value="ou"/>
   </bean>
 </constructor-arg>
</bean>

如果没有 xml,我们如何实现这一点? 这里我们有一个使用本地 ldif 文件的示例: https://github.com/spring-projects/spring-security/blob/master/samples/ldap-jc/src/main/java/org/springframework/security/samples/config/SecurityConfig.java

我已将 SecurityConfig.java 修改如下:

    public void registerGlobalAuthentication(AuthenticationManagerBuilder auth) throws Exception {
        DefaultSpringSecurityContextSource contextSource = new DefaultSpringSecurityContextSource(ldap_url);
        contextSource.setUrl(ldap_user);
        contextSource.setPassword(ldap_password);

        DefaultLdapAuthoritiesPopulator ldapAuthoritiesPopulator = new DefaultLdapAuthoritiesPopulator(contextSource, "ou=groups");
        ldapAuthoritiesPopulator.setGroupRoleAttribute("ou");

        LdapAuthenticationProviderConfigurer<AuthenticationManagerBuilder> ldapAuthenticationProviderConfigurer = auth.ldapAuthentication();

        ldapAuthenticationProviderConfigurer
            .userDnPatterns("uid={0},ou=people")
            .groupSearchBase("ou=groups")
            .contextSource(contextSource)
            .ldapAuthoritiesPopulator(ldapAuthoritiesPopulator);
    }
}

但是当我使用网络表单登录时,我收到了这个错误:

java.lang.NullPointerException
    at java.util.Hashtable.<init>(Hashtable.java:296)
    at org.springframework.ldap.core.support.AbstractContextSource.getAuthenticatedEnv(AbstractContextSource.java:499)
    at org.springframework.ldap.core.support.AbstractContextSource.doGetContext(AbstractContextSource.java:114)
    at org.springframework.ldap.core.support.AbstractContextSource.getContext(AbstractContextSource.java:110)
    at org.springframework.security.ldap.authentication.BindAuthenticator.bindWithDn(BindAuthenticator.java:112)

是否有与 http://docs.spring.io/spring-security/site/docs/3.2.4.CI-SNAPSHOT/reference/htmlsingle/#ldap 类似的文档解释如何在没有 spring xml 的情况下实现这一点?

【问题讨论】:

    标签: spring-security


    【解决方案1】:

    你需要打电话

    contextSource.afterPropertiesSet()
    

    如果您在应用程序上下文之外使用该类(有关更多信息,请参阅 Spring LDAP 的 AbstractContextSource 的源代码和 Javadoc)。要么这样,要么您可以将其设为 @Bean,Spring 将调用该方法并为您初始化它。

    还有

    contextSource.setUrl(ldap_user);
    

    看起来不对。不应该是setUserDn 吗?

    【讨论】:

    猜你喜欢
    • 2014-02-15
    • 2016-01-06
    • 2011-09-22
    • 2017-07-02
    • 2020-04-14
    • 2011-03-30
    • 2017-11-10
    • 2019-04-03
    • 2011-11-17
    相关资源
    最近更新 更多