我正在使用旧版本的Spring Security使用XML转移到使用Java配置的Spring Boot Security而不是旧的XML配置。我大约一周前有最新版本的Spring Boot 1.3.5.RELEASE
。
我当前的XML代码使用FilterBasedLdapUserSearch
和BindAuthenticator
来帮助查找和验证用户。这是必需的,因为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")
}
}
答案 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);
}
}