原文:http://docs.spring.io/spring-session/docs/current-SNAPSHOT/reference/html5/guides/security.html

本指南介绍如何将Spring Session与Spring Security一起使用。它假定您已经应用Spring Security到您的应用程序。

完整的指导可以在这里找到。

更新依赖

你用Spring Session之前,你必须确保更新你的依赖。如果你正在使用Maven,确保添加以下依存关系:

文件名:pom.xml

<dependencies>
        <!-- ... -->

        <dependency>
        <groupId>org.springframework.session</groupId>
        <artifactId>spring-session-data-redis</artifactId>
        <version>1.3.0.BUILD-SNAPSHOT</version>
        <type>pom</type>
        </dependency>
        <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-web</artifactId>
        <version>4.2.5.RELEASE</version>
        </dependency>
</dependencies>

由于我们使用的是快照版本,我们需要确保添加Spring快照Maven仓库。确保你的pom.xml包含如下内容:

文件名:pom.xml

<repositories>

        <!-- ... -->

        <repository>
        <id>spring-snapshot</id>
        <url>https://repo.spring.io/libs-snapshot</url>
        </repository>
</repositories>

Spring 配置

添加必需的依赖关系之后,我们就可以开始创建Spring配置。Spring配置负责创建一个Spring Session实现的Servlet过滤器来取代HttpSession实现的过滤器。增加如下Spring配置:

@Configuration
@EnableRedisHttpSession 
public class Config {

        @Bean
        public JedisConnectionFactory connectionFactory() {
                return new JedisConnectionFactory(); 
        }
}
  1. EnableRedisHttpSession创建了一个名为springSessionRepositoryFilter的Spring Bean来实现过滤器。这个由Spring Session实现的过滤器是负责替换HttpSession的实现。在这种情况下,Spring Session由redis支持。

  2. 然后创建了一个RedisConnectionFactory来连接Spring Session到地址是localhost,端口为6379的redis服务器。更多关于配置Spring Data Redis的信息可以参考这个文档

Servlet Container 初始化

上面的Spring 配置创建了一个名为springSessionRepositoryFilter的Spring Bean,为了让我们这个过滤器生效,Spring需要加载这个Config类。

由于我们的应用已经使用SecurityInitializer来加载Spring的配置,我们可以简单地把Config类加进去:

文件名:SecurityInitializer.java

public class SecurityInitializer extends AbstractSecurityWebApplicationInitializer {

        public SecurityInitializer() {
                super(SecurityConfig.class, Config.class);
        }
}

最后我们需要确保Servlet Container(如Tomcat)为每一个请求用上我们的springSessionRepositoryFilter。确保Spring Session的springSessionRepositoryFilterspringSecurityFilterChain之前调用非常重要,幸运的是,Spring Session提供了一个叫做AbstractHttpSessionApplicationInitializer的工具类让这件事变得超级容易。你可以按下面这么写:

文件名:Initializer.java

public class Initializer extends AbstractHttpSessionApplicationInitializer {

}

类的名字(Initializer)并不重要,重要的是我们继承了AbstractHttpSessionApplicationInitializer

通过继承AbstractHttpSessionApplicationInitializer类,我们确保了springSessionRepositoryFilterspringSecurityFilterChain之前调用。

Security 示例程序

运行 Security 示例程序

你可以获取源码,输入下面的命令,来运行 Security 示例程序。

为了让示例程序正常工作,你必须安装Redis 2.8+在本地(localhost),并运行在6379端口。或者,你也可以修改JedisConnectionFactory来指定一个Redis服务器

$ ./gradlew :samples:security:tomcatRun

现在你应该可以访问http://localhost:8080/

访问 Security 示例程序

试着开始用这个Web应用,输入下面的用户名密码来登录:

  • 用户名user

  • 密码password

接着点击“login”按钮,你应该能够看到一个提示你已经用user登录的消息。用户的登录信息此时保存在Redis中而不是Tomcat所实现的HttpSession中。

它是如何工作的

我们实际上是在持久化登录信息到Redis中,而不是Tomcat所实现的HttpSession。Spring Session代替了HttpSession,并使用Redis来存储数据:当Spring Security的SecurityContextPersistenceFilter保存SecurityContextHttpSession对象中时,他就会被持久化到Redis里。

对于Spring Security来说,当一个新的HttpSession被创建,Spring Session生成了一个名为SESSION的cookie发送到你的浏览器,它包含了这个Session的id。你可以到浏览器中看到这个Cookie(这里有ChromeFirefox关于Cookie的帮助)。

如果你愿意,你可以很容易用redis-cli从Redis中删掉刚才生成的Session。比如,在一个类Linux系统中你可以这么操作:

$ redis-cli keys '*' | xargs redis-cli del

Redis的文档中有说明如何安装redis-cli

或者,你也可以指定去删除某个key。例如输入下面的命令:

$ redis-cli del spring:session:sessions:7e8383a4-082c-4ffe-a4bc-c40fd3363c5e

现在访问http://localhost:8080/,你会发现刚才的登录认证已经取消了。


ziggear
935 声望6 粉丝

life is short, not long.


引用和评论

0 条评论