我的雇主已经设置了循环LDAP负载平衡。这导致我的Web应用程序(Java / Spring)出现用户创建/维护问题。例如,当用户注册时,我们将分配一个临时密码并向他们发送电子邮件。如果他们使用临时密码快速登录,则新用户可能未同步到其他LDAP服务器。这通常不是问题,因为同步比电子邮件更快,我们总是可以在发送电子邮件之前添加延迟。当他们使用临时密码登录时,最令人不安的是什么。
以下是应用程序处理临时密码登录的方式:
用户使用临时密码登录。
Spring的AccountStatusUserDetailsChecker
会引发CredentialsExpiredException
,我们会在UsernamePasswordAuthenticationFilter
中找到它。我们将它们发送到密码设置页面,提示他们输入新密码。当他们提交时,我们将密码更改激活到LDAP,然后尝试使用他们的新密码重新验证它们(我们不会提示他们重新进行身份验证,我们只是重用他们刚刚提交的密码)。但是,密码更改很可能没有传播到负载均衡器后面的所有LDAP节点。因此,我们进入一个延迟循环并重试身份验证。通常情况下这很好,但是当服务器之间的同步陷入困境时,我们实际上最终可以将它们锁定在帐户之外。
有没有人遇到过这个问题?任何保持Spring Security完整性的优雅解决方法(oxymoron?)(例如,我们不希望完全破解AccountStatusUserDetailsChecker
以允许具有过期凭据的用户获得有效的Principal
。
设置公司LDAP基础架构的人建议我们在整个密码更改流程中维护我们的LDAP连接,但是他们不明白在Web应用程序中做这样的事情是不可取的,因为你只是要求连接泄漏。