java - Glassfish 3.1.2.2 一段时间后更改了默认登录领域

标签 java authentication glassfish

我目前正在开发一个客户端-服务器应用程序,该应用程序使用 ProgrammaticLogin 针对服务器对客户端用户进行身份验证。 Glassfish 设置了一个通过 ActiveDirectory 进行身份验证的默认领域。我们最近将 glassfish 的版本从 3.0.1 升级到 3.1.2.2,现在我们遇到了一个奇怪的错误:运行一段时间后,看似随机地,默认安全性领域已更改为file,而不是ActiveDirectory-realm!不用说,这会限制人们从客户端登录的能力。当 glassfish 重新启动时,它会再次开始工作,并正确使用 ActiveDirectory-realm 进行身份验证。

有谁知道什么可能导致 Glassfish 出现这种行为?可能是与 AD 领域断开连接还是其他原因?

错误生效后堆栈跟踪摘录:

Programmatic login failed
com.sun.enterprise.security.auth.login.common.LoginException: Login failed: Failed file login for me.
    at com.sun.enterprise.security.auth.login.LoginContextDriver.doPasswordLogin(LoginContextDriver.java:394)
    at com.sun.enterprise.security.auth.login.LoginContextDriver.login(LoginContextDriver.java:240)
    at com.sun.enterprise.security.auth.login.LoginContextDriver.login(LoginContextDriver.java:153)
    at com.sun.appserv.security.ProgrammaticLogin$1.run(ProgrammaticLogin.java:174)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.sun.appserv.security.ProgrammaticLogin.login(ProgrammaticLogin.java:168)
    at com.sun.appserv.security.ProgrammaticLogin.login(ProgrammaticLogin.java:239)
    at com.sun.appserv.security.ProgrammaticLogin.login(ProgrammaticLogin.java:211)
    [...]
Caused by: javax.security.auth.login.LoginException: Failed file login for me.
    at com.sun.enterprise.security.auth.login.FileLoginModule.authenticate(FileLoginModule.java:84)
    at com.sun.enterprise.security.auth.login.PasswordLoginModule.authenticateUser(PasswordLoginModule.java:117)
    at com.sun.appserv.security.AppservPasswordLoginModule.login(AppservPasswordLoginModule.java:143)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:601)
    at javax.security.auth.login.LoginContext.invoke(LoginContext.java:784)
    at javax.security.auth.login.LoginContext.access$000(LoginContext.java:203)
    at javax.security.auth.login.LoginContext$4.run(LoginContext.java:698)
    at javax.security.auth.login.LoginContext$4.run(LoginContext.java:696)
    at java.security.AccessController.doPrivileged(Native Method)
    at javax.security.auth.login.LoginContext.invokePriv(LoginContext.java:695)
    at javax.security.auth.login.LoginContext.login(LoginContext.java:594)
    at com.sun.enterprise.security.auth.login.LoginContextDriver.doPasswordLogin(LoginContextDriver.java:382)

最佳答案

在我们的一个测试环境中发生错误后(奇怪的是,它几乎同时发生在 3 个不同的环境中,具有 3 个不同的 ldap),我能够进行调试并更接近解决方案。

首先,我们在发生错误时检查了domain.xml中的默认领域,它仍然指向我们的AD领域,而不是文件。

在使用调试器时,尝试使用文件登录后出现以下异常:

new ProgrammaticLogin().login(username, password);
new ProgrammaticLogin().login(username, password, "default", true);

这两者是等效的,并且都将其留给服务器来确定默认领域是什么。另一方面,当指定我想要进行身份验证的 AD 领域的名称时,它就像一个魅力:

new ProgrammaticLogin().login(username, password, "myRealm", true);

看来我们在 Glassfish 3.1.2.2 中存在一个错误,这使得 glassfish 对于默认登录领域是什么感到困惑。

作为旁注(或两个),对于两个受影响的环境,问题在几分钟后自行解决。另外,只需进入 glassfish 管理控制台,将默认领域更改为文件,然后返回 AD 领域也可以解决问题。 (可能仅保存页面就会产生相同的效果。)

关于java - Glassfish 3.1.2.2 一段时间后更改了默认登录领域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19245627/

相关文章:

java - 尝试对空对象引用调用虚拟方法 'android.text.Editable android.widget.EditText.getText()' 时出错

java - 如何将多对多映射为嵌套嵌入对象

amazon-web-services - AWS 认知 : How can I prevent multiple registrations with the same email address?

java - 持久登录 cookie,避免垃圾邮件,并使用 yahoo facebook id

VBA使用登录名和密码从网站下载csv文件

java - 无法使用 Maven 在 Android Studio 中导入 GSON/JSON

java - 从 jdk 14 迁移到 jdk 16

java - 当 session 超时时如何显示错误消息 glassfish 安全性?

jsp - 尝试从 Jersey 2 呈现 JSP 时出现 404

web-services - Glassfish、EJB3、SOAP Web 服务和基本身份验证