1

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

有谁知道可能导致这种行为的原因是什么Glassfish?可能是与AD-realm 的脱节还是什么?

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

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)
4

1 回答 1

0

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

首先,我们检查了错误发生时 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 领域也解决了问题。(可能只是保存页面会产生相同的效果。)

于 2013-10-11T13:12:47.700 回答