|
该版本仍在开发中,尚未被视为稳定。最新稳定版请使用Spring Session 3.5.3! |
春季课程与春季安全
更新依赖关系
在使用春季会话之前,您必须更新依赖。 如果你使用 Maven,必须添加以下依赖关系:
<dependencies>
<!-- ... -->
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
<version>4.0.1-SNAPSHOT</version>
<type>pom</type>
</dependency>
<dependency>
<groupId>io.lettuce</groupId>
<artifactId>lettuce-core</artifactId>
<version>6.8.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>7.0.0</version>
</dependency>
</dependencies>
Spring配置
添加所需的依赖后,我们可以创建 Spring 配置。
Spring配置负责创建一个servletFilter,以替换HttpSession实现时,Spring Session支持的实现。
为此,添加以下Spring配置:
@Configuration
@EnableRedisHttpSession (1)
public class Config {
@Bean
public LettuceConnectionFactory connectionFactory() {
return new LettuceConnectionFactory(); (2)
}
}
| 1 | 这@EnableRedisHttpSession注释生成一个名为springSessionRepositoryFilter实现Filter.
过滤器负责更换HttpSession实现将由 Spring Session 支持。在此实例中,Spring Session 由 Redis 支持。 |
| 2 | 我们创建一个RedisConnection工厂该连接将 Spring Session 连接到 Redis 服务器。我们将连接配置为连接到默认端口(6379)的本地主机。有关配置 Spring Data Redis 的更多信息,请参见参考文档。 |
Servlet 容器初始化
我们的春季配置创建了一个名为springSessionRepositoryFilter实现Filter.
这springSessionRepositoryFilterBean负责替换HttpSession并采用由 Spring Session 支持的自定义实现。
为了我们的Filter要施展它的魔力,Spring需要加载我们的配置类。 由于我们的应用已经通过使用 Spring 配置加载安全初始化器类,我们可以将配置类添加到它中。以下示例展示了如何实现:
public class SecurityInitializer extends AbstractSecurityWebApplicationInitializer {
public SecurityInitializer() {
super(SecurityConfig.class, Config.class);
}
}
最后,我们需要确保我们的Servlet容器(即Tomcat)使用我们的springSessionRepositoryFilter每一个请求。Spring Session极其重要springSessionRepositoryFilter在春季安全之前被调用springSecurityFilterChain.
这确保了HttpSessionSpring Security 使用的 Spring Session 支持。幸运的是,Spring Session 提供了一个名为AbstractHttpSessionApplicationInitializer这使得作变得非常简单。以下示例展示了如何实现:
public class Initializer extends AbstractHttpSessionApplicationInitializer {
}
我们类的名称(初始化器)并不重要。重要的是我们要扩展AbstractHttpSessionApplicationInitializer. |
通过扩展AbstractHttpSessionApplicationInitializer,我们确保Spring豆命名为springSessionRepositoryFilter在Spring Security之前,已通过我们的Servlet容器注册所有请求springSecurityFilterChain.
安全示例应用
本节介绍了如何与安全示例应用。
运行安全示例应用
您可以通过获取源代码并调用以下命令来运行示例:
$ ./gradlew :spring-session-sample-javaconfig-security:tomcatRun
为了让样本正常工作,你必须在localhost上安装Redis 2.8+,并用默认端口(6379)运行。
或者,你也可以更新RedisConnection工厂指向一个Redis服务器。
另一个选择是用 Docker 在 localhost 上运行 Redis。
详见 Docker Redis 仓库中的详细说明。 |
你现在应该可以在localhost:8080/访问该应用了
探索安全示例应用
现在你可以使用该应用程序了。请输入以下方式登录:
-
用户名
-
密码密码
现在点击登录按钮。你现在应该会看到一条消息,表示你已经登录,之前输入的用户是这样。用户的信息存储在Redis里,而不是Tomcat的HttpSession实现。
它是如何运作的?
而不是用Tomcat的HttpSession,我们在Redis中保持这些值。春季会话替换了HttpSession而该实现得到了Redis的支持。当Spring Security的SecurityContextPersistenceFilter节省安全上下文前往HttpSession,然后被持久化到Redis中。
当新的HttpSession创建了 Spring Session 创建一个名为会期在你的浏览器中。该 Cookie 包含你的会话 ID。你可以查看这些 Cookie(用 Chrome 或 Firefox)。
你可以使用 redis-cli 删除该会话。例如,在基于 Linux 的系统上,你可以输入以下命令:
$ redis-cli keys '*' | xargs redis-cli del
| Redis 文档中有安装 redis-cli 的说明。 |
或者,你也可以删除显式键。在终端输入以下命令,确保替换7E8383A4-082C-4fFE-A4BC-C40FD3363C5E其价值为会期饼干:
$ redis-cli del spring:session:sessions:7e8383a4-082c-4ffe-a4bc-c40fd3363c5e
现在你可以访问 localhost:8080/ 的应用程序,看到我们不再认证。