Glassfish 3.1.2 - 创建集群&部署app j_security_check循环

时间:2012-05-16 17:23:28

标签: mod-rewrite glassfish glassfish-3 mod-jk j-security-check

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

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

在集群环境中,我在浏览器中获取登录页面,输入有效的用户名和密码,单击提交按钮,j_security_check将响应标题中的位置页面设置为登录页面,而不是welcome-file。它向我们刚刚登录的登录页面发送。

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

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

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

我知道j_security_check可以转发到触发身份验证的页面(这可能是这里发生的事情),但是当没有“触发身份验证的页面”时,它何时转发到welcome-file? 编辑:我现在看到,它总是302重定向到引用者,在这种情况下是context-root。容器必须有一些规则来确定实际显示哪个页面。在我的集群示例中,它不是来自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

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

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 dev工具网络跟踪

下方

部署为/ 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 ...

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

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

P.S。我确实尝试过清理浏览器缓存,没有帮助!

更新:问题是在clustered / mod_jk环境中,j_security_check的回发有一个带有新sessionid的Set-Cookie,因此下一个请求会在另一个会话中进入。这似乎与粘性会话有关,但我仍然不知道如何解决它。我已经尝试将loadbalancer sticky_sessions设置为true和false但是没有帮助。

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

1 个答案:

答案 0 :(得分:0)

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