此版本仍在开发中,尚不被认为是稳定的。对于最新的稳定版本,请使用 Spring Session 3.5.2! |
Spring Session 和 Spring Security
更新依赖项
在使用 Spring Session 之前,您必须更新依赖项。 如果您使用 Maven,则必须添加以下依赖项:
<dependencies>
<!-- ... -->
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
<version>4.0.0-SNAPSHOT</version>
<type>pom</type>
</dependency>
<dependency>
<groupId>io.lettuce</groupId>
<artifactId>lettuce-core</artifactId>
<version>6.5.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>7.0.0-M7</version>
</dependency>
</dependencies>
弹簧配置
添加所需的依赖项后,我们可以创建 Spring 配置。
Spring 配置负责创建一个 servlet 过滤器,该过滤器将HttpSession
实现,由 Spring Session 支持的实现。
为此,请添加以下 Spring 配置:
Unresolved include directive in modules/ROOT/pages/guides/java-security.adoc - include::example$spring-session-samples/spring-session-sample-javaconfig-security/src/main/java/sample/Config.java[]
1 | 这@EnableRedisHttpSession 注释创建一个名称为springSessionRepositoryFilter 实现Filter .
过滤器负责更换HttpSession 由 Spring Session 支持的实现。
在这种情况下,Spring Session 由 Redis 支持。 |
2 | 我们创建一个RedisConnectionFactory 将 Spring Session 连接到 Redis 服务器。
我们将连接配置为连接到默认端口 (6379) 上的本地主机
有关配置 Spring Data Redis 的更多信息,请参阅参考文档。 |
Servlet 容器初始化
我们的 Spring 配置创建了一个名为springSessionRepositoryFilter
实现Filter
.
这springSessionRepositoryFilter
bean 负责将HttpSession
使用由 Spring Session 支持的自定义实现。
为了我们的Filter
为了发挥它的魔力,Spring 需要加载我们的Config
类。
由于我们的应用程序已经在加载 Spring 配置,因此使用SecurityInitializer
class,我们可以将我们的配置类添加到其中。
以下示例显示了如何执行此作:
Unresolved include directive in modules/ROOT/pages/guides/java-security.adoc - include::example$spring-session-samples/spring-session-sample-javaconfig-security/src/main/java/sample/SecurityInitializer.java[]
最后,我们需要确保我们的 Servlet 容器(即 Tomcat)使用springSessionRepositoryFilter
对于每个请求。
Spring Session的springSessionRepositoryFilter
在 Spring Security 的springSecurityFilterChain
.
这确保了HttpSession
Spring Security 使用的由 Spring Session 支持。
幸运的是,Spring Session 提供了一个名为AbstractHttpSessionApplicationInitializer
这使得这样做变得容易。
以下示例显示了如何执行此作:
Unresolved include directive in modules/ROOT/pages/guides/java-security.adoc - include::example$spring-session-samples/spring-session-sample-javaconfig-security/src/main/java/sample/Initializer.java[]
我们的类的名称(初始值设定项)并不重要。重要的是,我们扩展AbstractHttpSessionApplicationInitializer . |
通过扩展AbstractHttpSessionApplicationInitializer
,我们确保名为springSessionRepositoryFilter
在 Spring Security 之前的每个请求都向我们的 Servlet 容器注册springSecurityFilterChain
.
security
示例应用
本节介绍如何使用security
示例应用程序。
运行security
示例应用
您可以通过获取源代码并调用以下命令来运行示例:
$ ./gradlew :spring-session-sample-javaconfig-security:tomcatRun
要使示例正常工作,您必须在 localhost 上安装 Redis 2.8+ 并使用默认端口 (6379) 运行它。或者,您可以更新RedisConnectionFactory 指向 Redis 服务器。
另一种选择是使用 Docker 在本地主机上运行 Redis。
有关详细说明,请参阅 Docker Redis 存储库。 |
您现在应该能够在 localhost:8080/ 访问该应用程序
探索security
示例应用
现在您可以使用该应用程序。输入以下内容登录:
-
用户名 user
-
密码密码
现在点击 登录 按钮。
您现在应该会看到一条消息,指示您已使用之前输入的用户登录。
用户的信息存储在 Redis 中,而不是 Tomcat 的HttpSession
实现。
它是如何工作的?
而不是使用 Tomcat 的HttpSession
,我们将值保留在 Redis 中。Spring Session 替换了HttpSession
使用由 Redis 支持的实现。当 Spring Security 的SecurityContextPersistenceFilter
保存SecurityContext
到HttpSession
,然后将其持久化到 Redis 中。
当新的HttpSession
创建时,Spring Session 会创建一个名为SESSION
在您的浏览器中。该 cookie 包含您会话的 ID。您可以查看 cookie(使用 Chrome 或 Firefox)。
您可以使用 redis-cli 删除会话。例如,在基于 Linux 的系统上,您可以键入以下命令:
$ redis-cli keys '*' | xargs redis-cli del
Redis 文档包含安装 redis-cli 的说明。 |
或者,您也可以删除显式键。
在终端中输入以下命令,请务必将7e8383a4-082c-4ffe-a4bc-c40fd3363c5e
与您的价值SESSION
饼干:
$ redis-cli del spring:session:sessions:7e8383a4-082c-4ffe-a4bc-c40fd3363c5e
现在您可以访问 localhost:8080/ 的应用程序,并看到我们不再经过身份验证。