【发布时间】:2014-12-15 09:49:34
【问题描述】:
我使用 Apache Shiro 保护了应用程序。当我通过 localhost:8080/MyApp 访问我的应用程序时,我被成功重定向到 localhost:8080/MyApp/login。 我使用凭据进行身份验证,一切都很好 - 我被重定向到需要身份验证的主页。
我已经配置了 nginx 代理以使用“漂亮”的 url 访问应用程序,所以:
server {
server_name www.example.com example.com;
listen 80;
location / {
proxy_pass http://localhost:8080/MyApp/;
}
}
当我通过 www.example.com 访问我的应用程序时,我再次被成功重定向到 www.example.com/login,我填写了凭据,但随后我不再访问我的主页重定向到登录页面,就好像我没有通过身份验证一样。
我尝试了几件事,首先 - 我检查了我的请求是否到达负责身份验证的 url 以及我是否真正通过身份验证,我的控制器中有两个映射:
- /login - 重定向到 shiro 登录页面
- /login.do - 实际进行身份验证
当任何一个被调用时,如果我通过了身份验证,我将在控制台中显示:
System.out.println("is auth:" + SecurityUtils.getSubject().isAuthenticated());
当我访问 www.example.com 时,会发生以下情况:
- 我没有通过身份验证,因此 shiro 重定向到登录 url,调用 /login,我在控制台中看到我确实没有通过身份验证
- 我填写了我的用户名和密码,并将数据发布到 /login.do,在控制台中我看到我已成功通过身份验证,login.do 尝试重定向到主页,但结果却是登录屏幕,因此 /login 被调用,在控制台中我看到我不再经过身份验证
我不确定是 Shiro 的错还是 nginx 配置错误,所以我将 nginx 配置更改为以下内容:
server {
server_name www.example.com example.com;
listen 80;
location /MyApp {
proxy_pass http://localhost:8080;
}
}
使用上面的 nginx 配置并通过 www.example.com/MyApp 访问应用程序,一切都像一个魅力,我被重定向到登录页面,我成功验证,我被重定向到主页。
谁能解释这种行为?是 nginx 或 shiro 的问题,还是我遗漏了什么?
//编辑:我想我知道问题出在哪里,但我还不知道如何解决:
我认为 Shiro 使用应用程序名称来保存 cookie,www.example.com 和 www.example.com/MyApp 将 cookie 保存在同一路径 - /MyApp 下,因此 www.example.com 找不到正确的 cookie - 在这一点上这只是一个怀疑
//编辑:我开始认为这是由于 Sprintv MVC 重定向(我认为它不考虑 servlet 上下文)
【问题讨论】:
标签: java session nginx proxy shiro