我对 JBoss 部署非常陌生,我刚刚继承了将 RAP 网络应用程序和基于 Seam 的网络应用程序从 JBoss 7.1.1 迁移到 EAP 6.3 的任务。基于接缝的 Web 应用程序启动并运行良好,但我无法通过 RAP/Faces 端的身份验证部分。日志显示用户正在正确地进行身份验证,但主体名称是匿名的,并且似乎 EJBContext 在经过身份验证后没有保留经过身份验证的用户主体信息。
我将登录模块定义为:
<security-domain name="myRealm" cache-type="default">
<authentication>
<login-module code="org.jboss.security.auth.spi.DatabaseServerLoginModule"
flag="sufficient">
<module-option name="unauthenticatedIdentity" value="guest"/>
<module-option name="password-stacking" value="useFirstPass"/>
<module-option name="dsJndiName" value="java:jboss/datasources/myDatasource"/>
<module-option name="principalsQuery"
value="SELECT PASSWORD FROM USER WHERE USER_NAME = ?"/>
<module-option name="rolesQuery" value="SELECT VALUE, 'Roles'
from ROLES where USER_NAME = ?"/>
</login-module>
...
</authorization>
</security-domain>
我的 jboss-web.xml 是这样的:
<jboss-web>
<security-domain>java:/jaas/myRealm</security-domain>
</jboss-web>
正如我所提到的,身份验证似乎工作正常,因为日志表明正确的角色来自数据库并且没有指示任何约束。但是,此信息不会在主体中传播/保留……因此,当 RAP 应用程序入口点被命中,并且访问 EJBContext 以完成我们的工作并创建 UI 时,它会失败。
我认为这是我在这次迁移中没有做的事情,但到目前为止,我在这方面找到的帮助并没有帮助我克服这个障碍。我们正在使用旧版本的 RAP(我相信是 1.2)。在这次迁移中,我们也将迁移到 Java 8,但我的问题也发生在使用 Java 7(我们用于 JBoss 7.1.1 impl)时。所以我“假设”这不是 Java 问题,而是 EAP 部署问题。而且由于我们使用的是默认的 DatabaseServerLoginModule 模块,因此我没有像扩展 6.3 附带的模块那样定义自己的登录模块。
...一些更新的信息可能会帮助任何希望介入并提供帮助的人。在standalone-full.xml 文件中,我指定了“org.jboss.security.auth.spi.DatabaseServerLoginModule”模块,但在跟踪日志中似乎条目来自“org.apache.catalina.authenticator.DatabaseServerLoginModule”。我不知道这是正确的还是有问题的。来自我的 7.1.1 impl 的跟踪日志显示来自standalone-full.xml 文件中指定的模块的所有条目,而不是 catalina 版本。
我还看到,对于 7.1.1 impl,我有日志条目“用户'用户'已通过身份验证,loginOk = true”,但对于 EAP,我从未看到设置了 loginOk 标志,即使模块似乎表明用户已通过以下方式进行身份验证“经过身份验证的‘用户’类型为‘FORM’”和“用户 [用户] 具有角色 [用户]。” 但是 EAP 登录模块似乎没有像应有的那样设置 loginOk 标志=true。因此,根据我的发现,Principal 并没有像它应该做的那样使用用户的信息进行更新。
如果我假设定义的模块“org.jboss.security.auth.spi.DatabaseServerLoginModule”仍然有效,那么在用作代理或包装器的“org.apache.catalina.authenticator.DatabaseServerLoginModule”模块中可能存在问题到 JBoss 模块,它没有设置 loginOk 标志,而该标志又会设置正确的 Principal 值。但这是我的猜测。