Spring Security + Auth LDAP:BindRequest 和 UnbindRequest?
Posted
技术标签:
【中文标题】Spring Security + Auth LDAP:BindRequest 和 UnbindRequest?【英文标题】:Spring Security + Auth LDAP : BindRequest and UnbindRequest? 【发布时间】:2018-04-15 22:14:42 【问题描述】:经过几天的 Google 研究、阅读 F* Spring 安全手册和测试,我变得绝望了……
上下文:我正在使用 Eureka 等实现微服务架构...... 我实现了一个身份验证服务,它与 mysql 身份验证数据库配合得很好。但是现在,我想通过一个可以正常工作的 OpenLDAP 加入我公司的 LDAP。
所以,我正在尝试使用我的 spring 安全身份验证加入 LDAP。
我的configure()方法的代码(我换了我的公司和域名,账号0是“test”):
auth.ldapAuthentication()
.contextSource()
.url("ldap://myldap/ou=users,dc=mydomain,dc=mycompany")
.and()
.userDnPatterns("cn=0");
我也尝试了不同的方法来编写这个,但我一直收到 Bad Credentials 或 LDAP 32 错误。使用 userDnPattern、usersearchbase 方法、passwordcompare、passwordencoder 等。我还尝试将 DC 放在 root() 方法中,将 OU 放在 group...() 方法中,没有任何变化(我认为实际上 Spring Security 在发送 LDAP 请求之前对这些参数进行了智能排序)。老实说,我尝试了 357654 种不同的方式来编写 configure() 方法......
问题在于:当我将相同的配置、凭据、域...放入 LDAP 资源管理器软件时,它可以正常工作。
所以我监控了与 Wireshark 的 LDAP 网络交换,我看到了这个: Wireshark screen
我们可以看到,交换了 8 个请求。前5个还可以。它正确地找到了我的帐户“测试”。但是有三个 over requests(其中 unbindRequest 会返回)。
问题是 Spring 给了我最后一个请求的结果,并说我的帐户不存在或凭据不起作用等...
你有这方面的线索吗?你知道 Spring Security 是如何质疑 LDAP 的吗?如何才能将我的 LDAP 与框架充分联系起来?
感谢您的阅读。
帮助我 Stack Overflow,你是我唯一的希望......
【问题讨论】:
【参考方案1】:我终于找到了问题并得到了解决方案。
我的企业 LDAP 是 AD 之上的 LDAP。
而且这个 LDAP+AD 需要绑定认证,并且不授权匿名绑定然后认证。
在 Spring Security 中,有一个对象可以做到这一点:BindAuthenticator
这就是我尝试使用它的方式(并且有效)。
@Override
protected void configure(AuthenticationManagerBuilder authManagerBuilder) throws Exception
authManagerBuilder.authenticationProvider(ldapAuthenticationProvider()).userDetailsService(userDetailsService());
@Bean
public LdapAuthenticationProvider ldapAuthenticationProvider() throws Exception
LdapAuthenticationProvider lAP = new LdapAuthenticationProvider(ldapAuthenticator(), ldapAuthoritiesPopulator());
return lAP;
@Bean
public LdapContextSource ldapContextSource() throws Exception
DefaultSpringSecurityContextSource contextSource = new DefaultSpringSecurityContextSource([URL of the LDAP]);
return contextSource;
@Bean
public LdapAuthenticator ldapAuthenticator() throws Exception
BindAuthenticator authenticator = new BindAuthenticator(ldapContextSource());
authenticator.setUserDnPatterns(new String[] "CN=0,"+[MY ENTERPRISE LDAP FILTER]);
return authenticator;
希望这个示例代码可以帮助一些人...
谢谢!
【讨论】:
以上是关于Spring Security + Auth LDAP:BindRequest 和 UnbindRequest?的主要内容,如果未能解决你的问题,请参考以下文章
Spring Security:配置(AuthenticationManagerBuilder auth)
Spring Security:配置(AuthenticationManagerBuilder auth)与 authenticationManagerBean()