【问题标题】:Apache Shiro session invalid when accessing application through nginx proxy_pass通过 nginx proxy_pass 访问应用程序时 Apache Shiro 会话无效
【发布时间】: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 时,会发生以下情况:

  1. 我没有通过身份验证,因此 shiro 重定向到登录 url,调用 /login,我在控制台中看到我确实没有通过身份验证
  2. 我填写了我的用户名和密码,并将数据发布到 /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


    【解决方案1】:

    是的,确实是 Spring 重定向问题。 而不是返回:

    return "redirect:/some/path";
    

    我将返回以下内容:

    return new RedirectView("/some/path", true);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-02-04
      • 1970-01-01
      • 2012-04-24
      • 1970-01-01
      • 2019-10-23
      • 2014-02-27
      • 2010-12-02
      相关资源
      最近更新 更多