我正在尝试在WLS 12.1.2(JAAS容器安全性)中使用AD身份验证器来处理用户已设置为“必须在下次登录时更改密码”的情况,我理解这是在AD中设置的属性pwdLastSet。如果我为特定用户将其设置为0,然后尝试登录我的应用程序,我会在javax.servlet.http.HttpServletRequest.login(用户名,密码)方法上获得ServletException,并附带一个通用的FailedLoginException,但我不知道得到有关原因的任何信息。我真正需要的是来自AD的773错误代码或者向我的应用程序代码指示这就是request.login方法抛出异常的原因。不知何故,我们需要将其转换为javax.naming.AuthenticationException,如果我们使用新的InitialContext手动完成LDAP绑定,我们将得到它。似乎有点奇怪的是必须手动绑定以满足这样的备用场景,而容器安全性处理通用成功场景。有什么想法吗?
答案 0 :(得分:1)
解决方案是编写我们自己的身份验证提供程序&登录模块,以便我们自己可以使用用户的凭据绑定到AD,这反过来允许我们访问确切的NamingException。该异常包含绑定失败的唯一代码(在我们的例子中为773),然后我们能够将其转换为适当的LoginException子类(在我们的例子中是CredentialExpiredException)。然后在我们的Web应用程序中,request.login方法接收ServletException,其原因是我们的CredentialExpiredException,我们可以相应地重定向到更改密码页面。