使用Spring Security的Spring Boot Java配置:如何配置使用FilterBasedLdapUserSearch和BindAuthenticator?

时间:2016-06-07 23:25:12

标签: java xml spring spring-security spring-boot

我正在使用旧版本的Spring Security使用XML转移到使用Java配置的Spring Boot Security而不是旧的XML配置。我大约一周前有最新版本的Spring Boot 1.3.5.RELEASE

我当前的XML代码使用FilterBasedLdapUserSearchBindAuthenticator来帮助查找和验证用户。这是必需的,因为LDAP非常复杂,因此标准的基本弹簧安全设置将找不到用户。我的设置让我成功登录到LDAP,(我知道这很有效,因为如果我更改了用户名或密码,我会收到身份验证错误),但这就是使用下面的代码并且不会返回任何用户数据。我需要从LDAP获取用户数据才能知道他们是合法用户。

我已经在网上搜索了这方面的教程和示例,但没有找到任何有用的东西。有很多,但大部分都引用了基本示例,并没有解决高级LDAP设置。

有人能指出我正确的方向吗?有没有解决这个问题的教程或例子?

这是我现有的LDAP for XML:

<beans:bean id="initialDirContextFactory" class="org.springframework.security.ldap.DefaultSpringSecurityContextSource">
    <beans:constructor-arg value="ldapIpAddress:port" />
    <beans:constructor-arg value="dc=hostName,dc=com" />
    <beans:property name="userDn" value="userDNHere" />
    <beans:property name="password" value="passwordHere" />
</beans:bean>
<beans:bean id="ldapAuthProvider" class="org.springframework.security.ldap.authentication.LdapAuthenticationProvider">
    <beans:constructor-arg>
        <beans:ref local="ldapBindAuthenticator" />
    </beans:constructor-arg>
    <beans:constructor-arg>
        <beans:ref local="ldapAuthoritiesPopulator" />
    </beans:constructor-arg>
</beans:bean>

<beans:bean id="ldapBindAuthenticator" class="org.springframework.security.ldap.authentication.BindAuthenticator">
    <beans:constructor-arg>
        <beans:ref local="initialDirContextFactory" />
    </beans:constructor-arg>
    <beans:property name="userSearch" ref="userSearch" />
</beans:bean>

<beans:bean id="userSearch" class="org.springframework.security.ldap.search.FilterBasedLdapUserSearch">
    <beans:constructor-arg index="0">
        <beans:value></beans:value>
    </beans:constructor-arg>
    <beans:constructor-arg index="1">
        <beans:value>userNameSearchHere</beans:value>
    </beans:constructor-arg>
    <beans:constructor-arg index="2">
        <beans:ref local="initialDirContextFactory" />
    </beans:constructor-arg>
    <beans:property name="searchSubtree">
        <beans:value>true</beans:value>
    </beans:property>
</beans:bean>

我当前的Java配置在这里:

@Configuration
 protected static class AuthenticationConfiguration extends GlobalAuthenticationConfigurerAdapter {

     @Autowired
     public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
         LdapContextSource lcs = new LdapContextSource();
         lcs.setUserDn("userDHHere");
         lcs.setPassword("passwordHere");
         lcs.setUrl("ldapIpAddress:port/dc=hostHere,dc=com");
         lcs.setReferral("follow");
         lcs.afterPropertiesSet();
         auth
            .ldapAuthentication()
                .contextSource(lcs)
                .userSearchBase("ouBaseHere")
                .userSearchFilter("userNameSearchHere")
    }

 }

1 个答案:

答案 0 :(得分:1)

<强>解决

答案比想象的要简单,但需要一些搜索才能得到它。

Java配置的格式错误。一旦我将其修正为如下,它就会很棒。希望这可以帮助其他人让他们的LDAP正常工作。

请参阅上面的格式不正确的Java配置。

以下是更正后的Java配置:     @组态  protected static class AuthenticationConfiguration扩展GlobalAuthenticationConfigurerAdapter {

 @Autowired
 public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
     LdapContextSource lcs = new LdapContextSource();
     lcs.setUserDn("userDHHere");
     lcs.setPassword("passwordHere");
     lcs.setUrl("ldapIpAddress:port");
     lcs.setReferral("follow");
     lcs.setBase("dc=hostHere,dc=com");
     lcs.afterPropertiesSet();
     auth
        .ldapAuthentication()
            .contextSource(lcs)
            .userSearchBase("ouBaseHere")
            .userSearchFilter("userNameSearchHere")
    }
}

解决了这个问题后,我已经能够添加一个自定义的authorityPopulator来根据LDAP提交的用户名从数据库中获取角色。要对以下内容使用自定义Authorities Populator:

@Autowired
CustomAuthoritiesPopulator customAuthoritiesPopulator;

 @Autowired
 public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
     LdapContextSource lcs = new LdapContextSource();
     lcs.setUserDn("userDHHere");
     lcs.setPassword("passwordHere");
     lcs.setUrl("ldapIpAddress:port");
     lcs.setReferral("follow");
     lcs.setBase("dc=hostHere,dc=com");
     lcs.afterPropertiesSet();
     auth
        .ldapAuthentication()
            .contextSource(lcs)
            .userSearchBase("ouBaseHere")
            .userSearchFilter("userNameSearchHere")
            .ldapAuthoritiesPopulator(customAuthoritiesPopulator);
    }
}