0

我终于将我的应用程序部署到了 apache/mod_jk 负载平衡前面的 2 实例单节点测试集群。

在非集群环境中,我多年来一直使用 JDBCRealm 的容器安全性,并且它工作可靠。

在集群环境中,我在浏览器中获取登录页面,输入有效的用户名和密码,单击提交按钮,j_security_check 将响应头中的位置页面设置为登录页面,而不是欢迎文件。它转发到我们刚刚访问的登录页面。

我启用了 MySQL 常规查询日志,可以看到正在从正确的表中为正确的用户读取密码和组名。

我尝试设置 javax.enterprise.system.core.security.level=FINEST 但服务器日志中仍然没有输出。

使用部署到本地服务器而不是集群的相同应用程序,我可以访问 localhost:8080/ 并登录正常。如果我只是输入“localhost”并通过负载平衡器,它将无法工作。

我知道 j_security_check 可以转发到触发身份验证的页面(这可能是这里发生的事情),但是当没有“触发身份验证的页面”时,它何时转发到欢迎文件?编辑:我现在看到,它总是 302 重定向到引用者,在这种情况下是上下文根。容器必须有一些规则来确定实际显示哪个页面。在我的集群示例中,它不是来自 web.xml 的欢迎文件。

我还在集群配置中设置了我的身份验证领域:

asadmin> create-auth-realm --target c1 --classname com.sun.enterprise.security.auth.realm.jdbc.JDBCRealm --property jaas-context=jdbcRealm:datasource-jndi=jdbc/sportquest:user-table=users:user-name-column=username:password-column=password:group-table=users:group-name-column=groupname:digest-algorithm=SHA-256:encoding=Base64

我能想到的两个环境之间的唯一区别是,在集群设置中,我有一个从 http -> https (httpd.conf) 转发的 mod_rewrite 规则:

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

# This redirects from thingy.com to www.thingy.com
#
RewriteCond %{HTTP_HOST} !^thingy\.com$ [NC]  
RewriteRule ^(.*)$ %{HTTPS}://thingy.com/$1 [R=301,L]

编辑:在 chrome 开发工具网络跟踪下方添加

部署为 /MyApp 的工作场景:

GET http://localhost:8080/MyApp - 301 Moved Permanently (from cache)
GET http://localhost:8080/MyApp/ - 200 Ok
 ... login page loads ...
POST http://localhost:8080/MyApp/j_security_check - 302 Moved Temporarily
  the form data contains user/pass as expected & response header Location:
  http://localhost:8080/MyApp/
GET http://localhost:8080/MyApp/ - 200 Ok
 ... welcome-file page loads ...

部署为 root / 的不工作场景(集群):

GET http://localhost/ - 301 Moved Permanently (from cache)
GET https://localhost/ - 200 Ok
 ... login page loads ...
POST https://localhost/j_security_check - 302 Moved Temporarily
  the form data contains user/pass as expected & response header Location:
  https://localhost/
GET https://localhost/ - 200 Ok
 ... the login page loads ...

如果我输入了无效的登录凭据,那么在这两种情况下,我都会成功重定向到表单错误页面。

有人有什么建议吗?我只是没看到。谢谢。

ps 我确实尝试过清理浏览器缓存,没有帮助!

更新:问题在于,在 clustered/mod_jk 环境中,来自 j_security_check 的回发具有带有新 sessionid 的 Set-Cookie,因此下一个请求来自不同的会话。似乎这与粘性会话有关,但是我仍然不知道如何解决它。我尝试将负载均衡器sticky_sessions 设置为true 和false,但都没有帮助。

jvmRoute 为工作人员的两个实例设置。

4

1 回答 1

0

你为什么不直接使用 mod_proxy 和 mod_proxy_balancer 呢?这样,您可以为不同的上下文根设置反向 cookie 路径。如果您需要一些配置示例,请告诉我(在 iPhone atm 上)

于 2012-06-22T14:56:53.717 回答