javascript
[译]Spring Session 与 Spring Security
原文: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 {@Beanpublic JedisConnectionFactory connectionFactory() {return new JedisConnectionFactory(); } }EnableRedisHttpSession創建了一個名為springSessionRepositoryFilter的Spring Bean來實現過濾器。這個由Spring Session實現的過濾器是負責替換HttpSession的實現。在這種情況下,Spring Session由redis支持。
然后創建了一個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的springSessionRepositoryFilter在springSecurityFilterChain之前調用非常重要,幸運的是,Spring Session提供了一個叫做AbstractHttpSessionApplicationInitializer的工具類讓這件事變得超級容易。你可以按下面這么寫:
文件名:Initializer.java
public class Initializer extends AbstractHttpSessionApplicationInitializer {}類的名字(Initializer)并不重要,重要的是我們繼承了AbstractHttpSessionApplicationInitializer類
通過繼承AbstractHttpSessionApplicationInitializer類,我們確保了springSessionRepositoryFilter在springSecurityFilterChain之前調用。
Security 示例程序
運行 Security 示例程序
你可以獲取源碼,輸入下面的命令,來運行 Security 示例程序。
為了讓示例程序正常工作,你必須安裝Redis 2.8+在本地(localhost),并運行在6379端口?;蛘?#xff0c;你也可以修改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保存SecurityContext到HttpSession對象中時,他就會被持久化到Redis里。
對于Spring Security來說,當一個新的HttpSession被創建,Spring Session生成了一個名為SESSION的cookie發送到你的瀏覽器,它包含了這個Session的id。你可以到瀏覽器中看到這個Cookie(這里有Chrome和Firefox關于Cookie的幫助)。
如果你愿意,你可以很容易用redis-cli從Redis中刪掉剛才生成的Session。比如,在一個類Linux系統中你可以這么操作:
$ redis-cli keys '*' | xargs redis-cli delRedis的文檔中有說明如何安裝redis-cli
或者,你也可以指定去刪除某個key。例如輸入下面的命令:
$ redis-cli del spring:session:sessions:7e8383a4-082c-4ffe-a4bc-c40fd3363c5e現在訪問http://localhost:8080/,你會發現剛才的登錄認證已經取消了。
總結
以上是生活随笔為你收集整理的[译]Spring Session 与 Spring Security的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MySQL root密码重置 报错:m
- 下一篇: java JFrame修改左上角的图片