SecurityContextPersistenceFilter

SecurityContextPersistenceFilter主要是在SecurityContextRepository中保存更新一個securityContext,並將securityContext給以後的過濾器使用

本質上就是在session中生成一個securityContext——httpSession.setAttribute(springSecurityContextKey, context);

它的邏輯是這樣的

一、SecurityContextRepository.loadContext(),返回一個securityContext

   loadContext裏面的邏輯是這樣的:

1、 判斷session是否存在,如果存在先嚐試從session中httpSession.getAttribute(springSecurityContextKey)獲取securityContext,獲取不到或則session不存在,返回null

2、判斷securityContext是否爲null,爲null則新建一個securityContextImpl

3、將當前的securityContext的信息備份到SaveToSessionResponseWrapper,用戶在後面的saveContext進行比較處理

4、返回一個securityContext

二、將securiryContext放入SecurityContextHolder中

三、執行下面的過濾器chain.doFilter(holder.getRequest(), holder.getResponse());

四、運行完SecurityContextPersistenceFilter之後的所有過濾器,清空SecurityContextHolder中的securityContext,並將securityContext(這個securityContext保存有後面過濾器生成的數據)放入SecurityContextRepository中,也就是執行SecurityContextRepository.saveContext();

saveContext的邏輯如下

1、 判斷SecurityContext中的authentication是否爲空或者是不是Anonymous角色,

       如果是的話再判斷session是否存在,如果session存在並且securityContext不爲空的話,就從session將securityContext刪除

      這個的作用是如果你的權限過期了或者不具有權限,那麼session就不不應該還存在securityContext

2、判斷session是否爲空,如果不爲空,則比較securityContext是否有更新過(會與SaveToSessionResponseWrapper中的securityContext內容作比較),有的話,就更新下一下httpSession.setAttribute(springSecurityContextKey, context);


總結:由此可見SecurityContextPersistenceFilter主要是維護securityContext給後面的過濾器使用


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