我最近在 Ubuntu 14.04 VPS 上以 Apache2 为前端的 Tomcat7 上部署了一个 Java webapp。
我正在使用 mod_jk 连接 Apache2 和 Tomcat7。
所有静态资源均由 Tomcat 提供服务,但为了最佳实践、未来的可扩展性以及将来可能使用的一些模式,我希望将其置于 Apache 之下。
一切都运行良好,直到我想实现一个在测试期间使用的基本的身份验证弹出窗口 - 我只希望少数朋友能够访问该网站,并愿意为每个人创建一个帐户。
我计划在测试阶段结束后删除基本身份验证。只有身份验证弹出窗口有问题 - 如果我删除身份验证指令,网站就可以正常运行。
.war 文件名为 bbn(由 Tomcat 解压),因此目前我只需使用以下命令即可访问该应用程序http://服务器/bbn- 完美的。
以下是相关配置:
@Tomcat的server.xml:
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443"/>
@workers.属性:
worker.list=worker
worker.worker.type=ajp13
worker.worker.host=localhost
worker.worker.port=8009
@apache2/mods-available/jk.conf:
JkWorkersFile /etc/apache2/workers.properties
@apache2/conf-enabled/security.conf:
<Directory />
Options -ExecCGI -Includes -Indexes
AllowOverride None
Order Deny,Allow
Deny from all
</Directory>
(这会锁定 Apache,因为我只想使用它来“代理”)
@apache2/sites-enabled/000-default.conf:
JKMount /bbn* worker
(这样每个以 /bbn 开头的请求都会转到 Tomcat)
使用上述配置,一切都很好。但我想要简单的身份验证弹出窗口,所以我在 000-default.conf 中添加了以下内容:
<Location /bbn>
AuthType Basic
AuthName "bbn"
AuthUserFile /var/bbn/bbnusers.config
Require valid-user
Order allow,deny
Allow from all
</Location>
我使用该命令创建了几个用户htpasswd
,该命令创建了一个格式良好的文件并完美地将用户添加到其中。
现在麻烦来了:当我想访问http://服务器/bbn,我得到了身份验证弹出窗口(这很好),我输入用户名/密码,然后:
我看到我点击了 webapp 的 .jsp(我得到了正确的 html),太棒了!
但是对于每个需要下载的资源,例如图像、js 和 css,我都会收到一个新的身份验证弹出窗口(注意:如果我在那里输入了正确的凭据,则什么也得不到)。
我和朋友花了几个小时尝试替代配置和路径,但这就是结果 - 要么每个人都可以访问,要么没人能访问......目前我无法接受。
我该如何解决这个问题?
我不想使用 tomcat-users.xml,并且此类机制应该由 Apache 处理,而不需要任何与 java 相关的修改(至少是 web.xml..)
谢谢 !!!
============ 编辑:附加信息:
- 在 apache 访问日志中:当我 GET 时,
/server/bbn
我在 apache 日志中看到"GET /bbn HTTP/1.1" 401
(我认为 401 是正常的,因为我得到了 auth 弹出窗口)。
如果我随后在紧接着出现的弹出窗口中再次输入正确的凭据,我会在日志中看到相同的请求 (GET /bbn),同样是 401,但我也会在时间戳之前看到提供的用户名...然后,如果我按下 Esc 键或在弹出窗口中单击“取消”,则会提供 Tomcat 错误 jsp 页面,并且会针对每个资源 (js、css、图像) 弹出身份验证弹出窗口。无论我是否输入了正确的凭据,我都无法获取资源(我可以看到页面的 html,我确信凭据是正确的...)
- 在 apache 错误日志中:只要我输入正确的凭据就不会出现任何内容,否则就会出现与凭据相关的错误。
最后一件事:如果我尝试获取例如 http://服务器/bbn/img/flags/EARTH.gif代替http://服务器/bbn/(主页)我得到了完全一样的待遇
我认为 apache auth 不应该干扰在 Java 中的 Tomcat 中处理的经典 Spring Security 身份验证。特别是因为默认连接器值为“tomcatAuthentication='true'” - 我希望 Apache2 能够在人们测试网站之前充当“一次性访问墙”,也许我在这里扭曲了逻辑。
答案1
由于时间紧迫,而且我开始怀疑这种机制实际上不适合我的用例(特别是与实际的 tomcat 会话冲突),我删除了 Apache 身份验证并创建了一个 Java 拦截器,用于检查会话中是否有特殊令牌 - 如果没有,它会将您重定向到一个带有表单的简单页面。
因此,人们在填写“访问”表格后,一旦到达实际网站,仍然可以注册/登录等。这并不完美,但作为个人项目测试期间的临时措施,这是可行的!