springSecurity分離資源服務器分析

參考:https://github.com/spring-guides/tut-spring-security-and-angular-js/tree/master/vanilla
使用SpringSession實現HttpSession共享,從客戶端傳過來的Token到資源服務器進行Token解碼這種思路簡單,實現卻不簡單的做法在生產上應該不會去應用.主要原理看下圖:
原理圖
1.瀏覽器向UI服務器進行認證授權
2.將認證授權信息存儲在Redis服務器
3.瀏覽器從UI獲取Token(實際就是sessionId)
4.瀏覽器發送Token到Resource服務器獲取資源
5.Resource服務器根據Token向Redis服務器獲取認證授權信息
6.根據認證授權信息返回資源給瀏覽器

關鍵點分析:

在org.springframework.session.data.redis.config.annotation.web.http.RedisHttpSessionConfiguration#springSessionRepositoryFilter註冊springSessionRepositoryFilter Bean時會使用在demo.ResourceApplication#sessionStrategy註冊的HeaderHttpSessionStrategy Bean.HeaderHttpSessionStrategy Bean會被注入到springSessionRepositoryFilter Bean的httpSessionStrategy屬性.

在org.springframework.session.web.http.SessionRepositoryFilter聲明瞭SessionRepositoryRequestWrapper內部類,spring security在這裏對HttpSession進行了再封裝.於是在調用getSession方法,會根據httpSessionStrategy去取sessionId(常見有CookieHttpSessionStrategy和HeaderHttpSessionStrategy).

當發送請求時,會被一系列的攔截器攔截(看org.springframework.security.web.FilterChainProxy.VirtualFilterChain#doFilter),直到這個Filter爲SecurityContextPersistenceFilter時,調到doFilter的SecurityContext contextBeforeChainExecution = repo.loadContext(holder);這裏就會觸發getSession方法.得到Session後就可以得到認證授權信息.

從UI服務器返回的響應,再次以ajax方式向Resource服務器發請求,這裏就發生了跨域問題,對跨域問題,spring 4.2開始,得到了較好的支持.

發送Token是以請求頭的方式發送到資源服務器的,裏面還介紹了爲什麼不用cookie.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章