【问题标题】:Cannot get object from Session无法从 Session 中获取对象
【发布时间】:2013-04-25 21:13:27
【问题描述】:

我有以下场景:

  1. 我访问了一个使用 Spring Security 的 Web 应用程序,在会话中创建一个对象,让我们说一个带有一些条目的购物车。
  2. 我使用 RESTful 客户端访问应用程序。我确实有:用户、密码、JSESSIONID cookie 及其相应的值。两者都使用基本身份验证。

结果?我拿到了那个东西——这个箱子上的购物车——但它是空的。它没有添加的条目。这几乎就像 - 即使我能够成功进行身份验证,也有一种机制可以创建对象的新实例,而不是给我现有的实例。

您是否知道 Spring Security 以某种方式不允许这种情况发生。

我还注意到...我发送了 Cookie JSESSIONID=Number,当它响应时,它给了我一个不同的 JSESSIONID 编号,我的假设是,即使我有 wright 凭据并且它允许我登录,它不允许我使用同一个会话,它只是创建一个新会话,我的购物车在那里是空的。

任何帮助将不胜感激!

【问题讨论】:

  • 你确定你发送的是同一个cookie吗?请使用 Fiddler 确保您发送相同的 JSESSIONID
  • 你看到下面的答案了吗?有帮助吗?
  • 非常感谢您的 cmets Michael!我目前正在测试 Fiddler,我会告诉你进展如何。

标签: web-services spring-security restful-authentication jsessionid


【解决方案1】:

SpringSecurity 在认证后替换 JSESSIONID cookie(强烈建议不要禁用该功能以防止 Session Fixation 攻击)。 以下配置启用该功能

<http ...>
    ...
    <session-management session-fixation-protection="migrateSession" />
</http>

要复制现有会话属性,请使用migrateSession

根据文档http://static.springsource.org/spring-security/site/docs/3.2.x/reference/springsecurity-single.html#session-mgmt的属性值:

  • migrateSession - 创建一个新会话并将现有会话属性复制到新会话。这是默认设置。
  • 无 - 不做任何事情。原始会话将被保留。
  • newSession - 创建一个新的“干净”会话,而不复制现有会话数据。

【讨论】:

    【解决方案2】:

    Spring 在身份验证时创建一个新会话。这称为会话固定保护。在此处阅读更多信息:

    【讨论】:

    • 非常感谢凯文。我已经通过执行以下操作删除了对此的保护: 这是我正在做的事情:1.- 访问网络应用程序,2.- 获取价值对于 JSESSIONID cookie,3.- 使用 RESTFul 客户端访问,使用相同的凭据、身份验证(基本),然后我发送 JSESSIONID cookie,其值为 2。但是,即使我可以进行身份​​验证,它总是会创建一个新的会话,因此我的购物车是空的。知道如何克服这个问题吗?再次感谢您的热心帮助!
    • 你能分享你的spring安全配置吗?
    猜你喜欢
    • 1970-01-01
    • 2021-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-02
    • 2012-11-12
    相关资源
    最近更新 更多