javascript
[译]Spring Session 与 Spring Security
原文:http://docs.spring.io/spring-session/docs/current-SNAPSHOT/reference/html5/guides/security.html
本指南介紹如何將Spring Session與Spring Security一起使用。它假定您已經(jīng)應(yīng)用Spring Security到您的應(yīng)用程序。
完整的指導(dǎo)可以在這里找到。
更新依賴
你用Spring Session之前,你必須確保更新你的依賴。如果你正在使用Maven,確保添加以下依存關(guān)系:
文件名: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包含如下內(nèi)容:
文件名:pom.xml
<repositories><!-- ... --><repository><id>spring-snapshot</id><url>https://repo.spring.io/libs-snapshot</url></repository> </repositories>Spring 配置
添加必需的依賴關(guān)系之后,我們就可以開始創(chuàng)建Spring配置。Spring配置負(fù)責(zé)創(chuàng)建一個Spring Session實現(xiàn)的Servlet過濾器來取代HttpSession實現(xiàn)的過濾器。增加如下Spring配置:
@Configuration @EnableRedisHttpSession public class Config {@Beanpublic JedisConnectionFactory connectionFactory() {return new JedisConnectionFactory(); } }EnableRedisHttpSession創(chuàng)建了一個名為springSessionRepositoryFilter的Spring Bean來實現(xiàn)過濾器。這個由Spring Session實現(xiàn)的過濾器是負(fù)責(zé)替換HttpSession的實現(xiàn)。在這種情況下,Spring Session由redis支持。
然后創(chuàng)建了一個RedisConnectionFactory來連接Spring Session到地址是localhost,端口為6379的redis服務(wù)器。更多關(guān)于配置Spring Data Redis的信息可以參考這個文檔。
Servlet Container 初始化
上面的Spring 配置創(chuàng)建了一個名為springSessionRepositoryFilter的Spring Bean,為了讓我們這個過濾器生效,Spring需要加載這個Config類。
由于我們的應(yīng)用已經(jīng)使用SecurityInitializer來加載Spring的配置,我們可以簡單地把Config類加進(jìn)去:
文件名:SecurityInitializer.java
public class SecurityInitializer extends AbstractSecurityWebApplicationInitializer {public SecurityInitializer() {super(SecurityConfig.class, Config.class);} }最后我們需要確保Servlet Container(如Tomcat)為每一個請求用上我們的springSessionRepositoryFilter。確保Spring Session的springSessionRepositoryFilter在springSecurityFilterChain之前調(diào)用非常重要,幸運(yùn)的是,Spring Session提供了一個叫做AbstractHttpSessionApplicationInitializer的工具類讓這件事變得超級容易。你可以按下面這么寫:
文件名:Initializer.java
public class Initializer extends AbstractHttpSessionApplicationInitializer {}類的名字(Initializer)并不重要,重要的是我們繼承了AbstractHttpSessionApplicationInitializer類
通過繼承AbstractHttpSessionApplicationInitializer類,我們確保了springSessionRepositoryFilter在springSecurityFilterChain之前調(diào)用。
Security 示例程序
運(yùn)行 Security 示例程序
你可以獲取源碼,輸入下面的命令,來運(yùn)行 Security 示例程序。
為了讓示例程序正常工作,你必須安裝Redis 2.8+在本地(localhost),并運(yùn)行在6379端口。或者,你也可以修改JedisConnectionFactory來指定一個Redis服務(wù)器
$ ./gradlew :samples:security:tomcatRun現(xiàn)在你應(yīng)該可以訪問http://localhost:8080/了
訪問 Security 示例程序
試著開始用這個Web應(yīng)用,輸入下面的用戶名密碼來登錄:
用戶名:user
密碼:password
接著點擊“l(fā)ogin”按鈕,你應(yīng)該能夠看到一個提示你已經(jīng)用user登錄的消息。用戶的登錄信息此時保存在Redis中而不是Tomcat所實現(xiàn)的HttpSession中。
它是如何工作的
我們實際上是在持久化登錄信息到Redis中,而不是Tomcat所實現(xiàn)的HttpSession。Spring Session代替了HttpSession,并使用Redis來存儲數(shù)據(jù):當(dāng)Spring Security的SecurityContextPersistenceFilter保存SecurityContext到HttpSession對象中時,他就會被持久化到Redis里。
對于Spring Security來說,當(dāng)一個新的HttpSession被創(chuàng)建,Spring Session生成了一個名為SESSION的cookie發(fā)送到你的瀏覽器,它包含了這個Session的id。你可以到瀏覽器中看到這個Cookie(這里有Chrome和Firefox關(guān)于Cookie的幫助)。
如果你愿意,你可以很容易用redis-cli從Redis中刪掉剛才生成的Session。比如,在一個類Linux系統(tǒng)中你可以這么操作:
$ redis-cli keys '*' | xargs redis-cli delRedis的文檔中有說明如何安裝redis-cli
或者,你也可以指定去刪除某個key。例如輸入下面的命令:
$ redis-cli del spring:session:sessions:7e8383a4-082c-4ffe-a4bc-c40fd3363c5e現(xiàn)在訪問http://localhost:8080/,你會發(fā)現(xiàn)剛才的登錄認(rèn)證已經(jīng)取消了。
總結(jié)
以上是生活随笔為你收集整理的[译]Spring Session 与 Spring Security的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MySQL root密码重置 报错:m
- 下一篇: java JFrame修改左上角的图片