Spring 会话在身份验证期间和之后返回不同的会话 ID

问题描述 投票:0回答:2

我有一个同时使用 Spring Security 和 Spring Session 的应用程序。我正在转换我的应用程序,以使用 XML jdbc 配置将其 Spring 会话存储在 MySQL 中,这似乎有效,因为会话记录出现在 MySQL 表中。

由于其他原因,我将内部创建的会话对象与 Spring 会话对象结合使用,并尝试使用 Spring 会话 ID 来链接两个会话。这是我遇到的基本问题:

首先我进行身份验证,并创建一个 Spring 会话。 这给了我 Spring 会话 ID A,我将其存储在内部会话表中以链接到 Spring 会话。 其他过滤器被命中,并且请求到达 REST 控制器。 在 REST 控制器中,我尝试访问 spring 会话,并且看到有效的 ID 和 spring 会话,但 Spring 会话 ID B,因此 spring 会话和我的内部会话之间的连接已断开。

我是否有理由进行 2 个单独的经过身份验证的 Spring 会话,并且会话中的主体信息相同?

单独但相关的问题,如果我尝试通过 RequestContextHolder 访问 spring 会话 ID,它会给出标准全大写十六进制代码格式的 ID(例如 3AD475F78823D7CDC5C4571D50B0AB35),而如果我通过 SecurityContextHolder 访问它,则 ID 处于不同的格式格式(例如 c2215820-bd08-4c78-b26e-0821913333a1),是否有特殊原因?

谢谢。

java spring spring-security spring-session
2个回答
0
投票

为了防止会话固定,Spring Security 默认情况下会在身份验证后为您提供一个新会话,请参阅 https://www.baeldung.com/spring-security-session#session-fixation

请告诉我这是否有用。

-卡杰:)


0
投票

查看 DefaultCookieSerializer.setUseBase64Encoding()。默认情况下,cookie 上设置的值采用 base64 编码。您可以对 3AD475F78823D7CDC5C4571D50B0AB35 进行 Base64 解码,您将获得会话 id 的值

© www.soinside.com 2019 - 2024. All rights reserved.