Spring 嵌入式 LDAP 不绑定散列密码
Spring Embedded LDAP does not bind hashed passwords
我正在尝试实施 Spring 引导 LDAP 安全性,并且我正在使用 unboundid-ldapsdk 嵌入式 LDAP 服务器进行测试(如教程 here).我将网络安全配置为使用 LDAP 绑定进行身份验证,并使用明文密码成功测试。但是,如果我将密码更改为散列版本,则身份验证失败。我是否缺少某些配置?
这是我的安全配置:
@Configuration
@EnableWebSecurity
public class MyWebSecurityConfiguration extends WebSecurityConfigurerAdapter
{
...
@Override
protected void configure(AuthenticationManagerBuilder authenticationManagerBuilder)
throws Exception
{
authenticationManagerBuilder.
ldapAuthentication().
userSearchFilter(this.ldapUserSearchFilter).
userSearchBase(this.ldapUserSearchBase).
contextSource(this.contextSource()).
ldapAuthoritiesPopulator(this.authoritiesPopulator());
}
@Bean
public DefaultSpringSecurityContextSource contextSource()
{
DefaultSpringSecurityContextSource securityContextSource =
new DefaultSpringSecurityContextSource(
Collections.singletonList(this.ldapUrl),
this.ldapBaseDn);
return securityContextSource;
}
...
}
嵌入式 LDAP 属性:
spring.ldap.embedded.ldif=classpath:ldap-test.ldif
spring.ldap.embedded.base-dn=dc=testing,dc=com
spring.ldap.embedded.port=8389
和 LDIF 文件:
dn: dc=testing,dc=com
objectclass: top
objectclass: domain
objectclass: extensibleObject
dc: testing
dn: ou=TestingUsers,dc=testing,dc=com
objectclass: top
objectclass: organizationalUnit
ou: TestingUsers
dn: uid=testUser,ou=TestingUsers,dc=testing,dc=com
objectclass: top
objectclass: person
objectclass: organizationalPerson
objectclass: inetOrgPerson
cn: Blah_1
sn: Blah_2
uid: testingUser
userPassword: pass
使用这些设置,我可以使用用户名进行身份验证
testingUser 和密码 pass。但是如果我使用散列密码:
userPassword: {SHA}9d4e1e23bd5b727046a9e3b4b7db57bd8d6ee684
我无法进行身份验证,并收到此异常:
javax.naming.AuthenticationException: [LDAP: error code 49 - Unable to bind as user 'uid=testingUser,ou=TestingUsers,dc=testing,dc=com' because the provided password was incorrect.]
感谢您的帮助!
更新:
我发现使用散列密码,我可以通过输入散列本身而不是原始密码来进行身份验证。所以也许 unboundid-ldapsdk 不识别 {SHA} 符号?
我只是偶然发现了同样的问题,我提交了一个 bug 因为散列密码似乎没有被库正确处理(我不确定它们是否完全被支持)。
我正在尝试实施 Spring 引导 LDAP 安全性,并且我正在使用 unboundid-ldapsdk 嵌入式 LDAP 服务器进行测试(如教程 here).我将网络安全配置为使用 LDAP 绑定进行身份验证,并使用明文密码成功测试。但是,如果我将密码更改为散列版本,则身份验证失败。我是否缺少某些配置?
这是我的安全配置:
@Configuration
@EnableWebSecurity
public class MyWebSecurityConfiguration extends WebSecurityConfigurerAdapter
{
...
@Override
protected void configure(AuthenticationManagerBuilder authenticationManagerBuilder)
throws Exception
{
authenticationManagerBuilder.
ldapAuthentication().
userSearchFilter(this.ldapUserSearchFilter).
userSearchBase(this.ldapUserSearchBase).
contextSource(this.contextSource()).
ldapAuthoritiesPopulator(this.authoritiesPopulator());
}
@Bean
public DefaultSpringSecurityContextSource contextSource()
{
DefaultSpringSecurityContextSource securityContextSource =
new DefaultSpringSecurityContextSource(
Collections.singletonList(this.ldapUrl),
this.ldapBaseDn);
return securityContextSource;
}
...
}
嵌入式 LDAP 属性:
spring.ldap.embedded.ldif=classpath:ldap-test.ldif
spring.ldap.embedded.base-dn=dc=testing,dc=com
spring.ldap.embedded.port=8389
和 LDIF 文件:
dn: dc=testing,dc=com
objectclass: top
objectclass: domain
objectclass: extensibleObject
dc: testing
dn: ou=TestingUsers,dc=testing,dc=com
objectclass: top
objectclass: organizationalUnit
ou: TestingUsers
dn: uid=testUser,ou=TestingUsers,dc=testing,dc=com
objectclass: top
objectclass: person
objectclass: organizationalPerson
objectclass: inetOrgPerson
cn: Blah_1
sn: Blah_2
uid: testingUser
userPassword: pass
使用这些设置,我可以使用用户名进行身份验证 testingUser 和密码 pass。但是如果我使用散列密码:
userPassword: {SHA}9d4e1e23bd5b727046a9e3b4b7db57bd8d6ee684
我无法进行身份验证,并收到此异常:
javax.naming.AuthenticationException: [LDAP: error code 49 - Unable to bind as user 'uid=testingUser,ou=TestingUsers,dc=testing,dc=com' because the provided password was incorrect.]
感谢您的帮助!
更新:
我发现使用散列密码,我可以通过输入散列本身而不是原始密码来进行身份验证。所以也许 unboundid-ldapsdk 不识别 {SHA} 符号?
我只是偶然发现了同样的问题,我提交了一个 bug 因为散列密码似乎没有被库正确处理(我不确定它们是否完全被支持)。