cas登出原始碼解析
logout-webflow.xml檔案定義了cas登出工作流,
登出第一步
登出第一步定義如下:
<action-state id="terminateSession">
<evaluate expression="terminateSessionAction.terminate(flowRequestContext)" />
<transition to="doLogout" />
</action-state>
terminateSessionAction bean定義如下:
首先分析org.jasig.cas.web.flow.TerminateSessionAction類的terminate()方法:<bean id="terminateSessionAction" class="org.jasig.cas.web.flow.TerminateSessionAction" c:cas-ref="centralAuthenticationService" c:tgtCookieGenerator-ref="ticketGrantingTicketCookieGenerator" c:warnCookieGenerator-ref="warnCookieGenerator"/>
public Event terminate(final RequestContext context) { // in login's webflow : we can get the value from context as it has already been stored String tgtId = WebUtils.getTicketGrantingTicketId(context); // for logout, we need to get the cookie's value if (tgtId == null) { final HttpServletRequest request = WebUtils.getHttpServletRequest(context); tgtId = this.ticketGrantingTicketCookieGenerator.retrieveCookieValue(request); } if (tgtId != null) { WebUtils.putLogoutRequests(context, this.centralAuthenticationService.destroyTicketGrantingTicket(tgtId)); } final HttpServletResponse response = WebUtils.getHttpServletResponse(context); this.ticketGrantingTicketCookieGenerator.removeCookie(response); this.warnCookieGenerator.removeCookie(response); return this.eventFactorySupport.success(this); }
1.從上下文中獲取“ticketGrantingTicketId”。優先從RequestScope中獲取“ticketGrantingTicketId”,如果為空,則從FlowScope中獲取同等引數
2.如果TGT為空,則從快取中獲取
3.銷燬TGT資源。
1)從根據TGT從ticketRegistry獲取TicketGrantingTicket物件(實際是TicketGrantingTicketImpl物件)
2) 獲取TGT物件所有service,並從TGT物件中移除;設定TGT物件為過期狀態;如果啟用單點登出,則遍歷所有servcice物件,對每個物件做如下處理:
2.1)檢查service物件是否屬於SingleLogoutService類的例項,如果是,並且該service未登出,則new一個LogoutRequest物件(入參就是該service物件),並且新增到LogoutRequest列表中
2.2)servicesManager查詢該service物件,得到註冊的RegisteredService物件
2.3)如果RegisteredService物件為空,或者RegisteredService物件的登出型別為空,或者登出型別為BACK_CHANNEL,則建立一個登出訊息,內容如下:
<samlp:LogoutRequest
xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol"
xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion"
ID="[RANDOM ID]"
Version="2.0"
IssueInstant="[CURRENT DATE/TIME]">
<saml:NameID>@[email protected]</saml:NameID>
<samlp:SessionIndex>[SESSION IDENTIFIER]</samlp:SessionIndex>
</samlp:LogoutRequest>
然後設定該service物件為已經登出,通過httpclient向service的OriginalUrl傳送請求,如果傳送成功,則設定該LogoutRequest未成功處理過了的標誌,否則設定處理失敗標誌。
最後返回LogoutRequest列表
3)從ticketRegistry中移除TGT物件
4.將前面返回的LogoutRequest列表放到FlowScope的"logoutRequests"中儲存
5.從response中移除cookie
登出第2步
工作流定義如下:
<action-state id="doLogout">
<evaluate expression="logoutAction" />
<transition on="finish" to="finishLogout" />
<transition on="front" to="frontLogout" />
</action-state>
logoutAction的bean定義如下:
<bean id="logoutAction" class="org.jasig.cas.web.flow.LogoutAction"
p:servicesManager-ref="servicesManager"
p:followServiceRedirects="${cas.logout.followServiceRedirects:true}"/>
直接看LogoutAction的核心方法:
protected Event doInternalExecute(final HttpServletRequest request, final HttpServletResponse response,
final RequestContext context) throws Exception {
boolean needFrontSlo = false;
putLogoutIndex(context, 0);
final List<LogoutRequest> logoutRequests = WebUtils.getLogoutRequests(context);
if (logoutRequests != null) {
for (LogoutRequest logoutRequest : logoutRequests) {
// if some logout request must still be attempted
if (logoutRequest.getStatus() == LogoutRequestStatus.NOT_ATTEMPTED) {
needFrontSlo = true;
break;
}
}
}
final String service = request.getParameter("service");
if (this.followServiceRedirects && service != null) {
final RegisteredService rService = this.servicesManager.findServiceBy(new SimpleWebApplicationServiceImpl(service));
if (rService != null && rService.isEnabled()) {
context.getFlowScope().put("logoutRedirectUrl", service);
}
}
// there are some front services to logout, perform front SLO
if (needFrontSlo) {
return new Event(this, FRONT_EVENT);
} else {
// otherwise, finish the logout process
return new Event(this, FINISH_EVENT);
}
}
1.從FlowScope中讀取引數“logoutRequests”值
2.如果LogoutRequest列表不為空,則遍歷列表,檢查每個LogoutRequest的狀態是否為LogoutRequestStatus.NOT_ATTEMPTED,如果是,則說明還有服務未能關閉,需要再次嘗試關閉
3.如果允許重定向且請求中service引數不為空,且該服務對應的RegisteredService中有註冊,則將service引數值儲存到FlowScope中的"logoutRedirectUrl"
4.返回Event
相關推薦
cas登出原始碼解析
logout-webflow.xml檔案定義了cas登出工作流, 登出第一步 登出第一步定義如下: <action-state id="terminateSession"> <evaluate expression="terminateSes
CAS整合原始碼解析
CAS是其中一種SSO(單點登入)的實現,可以用做企業單點登入系統的整合。 CAS主要分為兩個部分cas-server和cas-client,分別是整合在服務端(中央票據校驗)和客戶端(整合應用的子系統)。在應用改造層面,要先了解cas-server和cas-client的主要類和基本實現構架。 &n
EventBus原始碼解析(二)—釋出事件和登出流程
1.EventBus原始碼解析(一)—訂閱過程 2.EventBus原始碼解析(二)—釋出事件和登出流程 前言 上一篇部落格已經比較詳細的講解了EventBus的註冊過程,有了上一篇部落格的基礎,其實關於EventBus的原始碼中的其他流程就非常好理解了,尤其是我
cas+shiro統一登出原理解析
轉載:https://www.cnblogs.com/chenrd/p/5164706.html 1,客戶端傳送一個登出請求到cas server,跟蹤casorg.jasig.cas.CentralAuthenticationServiceImpl類的destroyTicketGranting
1、[置頂] CAS單點登入原始碼解析之【客戶端】
前期準備: 2.cas-client-3.2.1-release.zip 3.應用系統webapp(http://127.0.0.1:8090/webapp/main.do) 4.CAS單點登入伺服器端(http://127.0.0.1:8081/cas-server/)
CAS5.2x單點登入(九)---------cas服務端的退出原始碼解析以及客戶端儲存session及銷燬session原始碼的解析
上一節已經說了如何解決cas客戶端叢集的單點退出的方法,但是由於大家對原始碼還不夠了解,所以沒有寫程式碼上去,而我們這篇部落格就是基於上篇來進一步講解。 cas服務端的退出原始碼: 首先我們要找到這個jar包,因為我們是基於maven來管理這些包的,所以可以
CAS單點登入原始碼解析之【伺服器端】
前期準備: 2.應用系統webapp1(http://127.0.0.1:8090/webapp1/main.do) 3.應用系統webapp2(http://127.0.0.1:8091/webapp2/main.do) 4.CAS單點登入伺服器端(http://127
cas客戶端流程詳解(原始碼解析)--單點登入
博主之前一直使用了cas客戶端進行使用者的單點登入操作,決定進行原始碼分析來看cas的整個流程,以便以後出現了問題還不知道是什麼原因導致的 cas主要的形式就是通過過濾器的形式來實現的,來,貼上示例配置: 1 <listener> 2 <listener-cl
Java併發包原始碼學習系列:基於CAS非阻塞併發佇列ConcurrentLinkedQueue原始碼解析
[toc] ## 非阻塞併發佇列ConcurrentLinkedQueue概述 我們之前花了很多時間瞭解學習BlockingQueue阻塞佇列介面下的各種實現,也大概對阻塞佇列的實現機制有了一定的瞭解:阻塞 + 佇列嘛。 而且其中絕大部分是完全基於獨佔鎖ReentrantLock和條件機制conditi
Netty進階:Futrue&Promise原始碼解析
文章目錄 1. Future&Promise 2. AbstractFuture 3.Completefuture 4.Channelfuture&Completechannel
大資料基礎(1)zookeeper原始碼解析
五 原始碼解析 public enum ServerState { LOOKING, FOLLOWING, LEADING, OBSERVING;}zookeeper伺服器狀態:剛啟動LOOKING,follower是FOLLOWING,leader是LEADING,observer是
Android框架原始碼解析之(四)Picasso
這次要分析的原始碼是 Picasso 2.5.2 ,四年前的版本,用eclipse寫的,但不影響這次我們對其原始碼的分析 地址:https://github.com/square/picasso/tree/picasso-parent-2.5.2 Picasso的簡單使用
Android框架原始碼解析之(三)ButterKnife
注:所有分析基於butterknife:8.4.0 原始碼目錄:https://github.com/JakeWharton/butterknife 其中最主要的3個模組是: Butterknife註解處理器https://github.com/JakeWharton/
Android框架原始碼解析之(二)OKhttp
原始碼在:https://github.com/square/okhttp 包實在是太多了,OKhttp核心在這塊https://github.com/square/okhttp/tree/master/okhttp 直接匯入Android Studio中即可。 基本使用:
Android框架原始碼解析之(一)Volley
前幾天面試CVTE,HR面掛了。讓內部一個學長幫我查看了一下面試官評價,發現二面面試官的評價如下: 廣度OK,但缺乏深究能力,深度與實踐不足 原始碼:只能說流程,細節程式碼不清楚,retrofit和volley都是。 感覺自己一方面:自己面試技巧有待提高吧(框
HashMap原始碼解析(JDK8)
前言 這段時間有空,專門填補了下基礎,把常用的ArrayList、LinkedList、HashMap、LinkedHashMap、LruCache原始碼看了一遍,List相對比較簡單就不單獨介紹了,Map準備用兩篇的篇幅,分別介紹HashMap和(LruCache+LinkedHa
原始碼解析--Long、long型別的比較遇到的問題
Long、long型別的比較遇到的問題: 1、long 是基本型別 Long是物件型別。 public static void main(String[] args) { Long A = 127l; Long B = 127l; long C = 127; l
CopyOnWriteArrayList實現原理以及原始碼解析
CopyOnWriteArrayList實現原理以及原始碼解析 1、CopyOnWrite容器(併發容器) Copy-On-Write簡稱COW,是一種用於程式設計中的優化策略。 其基本思路是,從一開始大家都在共享同一個內容,當某個人想要修改這個內容的時候,才
LinkedList實現原理以及原始碼解析(1.7)
LinkedList實現原理以及原始碼解析(1.7) 在1.7之後,oracle將LinkedList做了一些優化, 將1.6中的環形結構優化為了直線型了連結串列結構。 1、LinkedList定義: public class LinkedList<E>
ArrayList實現原理以及原始碼解析(補充JDK1.7,1.8)
ArrayList實現原理以及原始碼解析(補充JDK1.7,1.8) ArrayList的基本知識在上一節已經討論過,這節主要看ArrayList在JDK1.6到1.8的一些實現變化。 JDK版本不一樣,ArrayList類的原始碼也不一樣。 1、ArrayList類結構: