1. 程式人生 > >cas登出原始碼解析

cas登出原始碼解析

logout-webflow.xml檔案定義了cas登出工作流,

登出第一步

登出第一步定義如下:

  <action-state id="terminateSession">
    <evaluate expression="terminateSessionAction.terminate(flowRequestContext)" />
    <transition to="doLogout" />
  </action-state>

terminateSessionAction bean定義如下:
<bean id="terminateSessionAction" class="org.jasig.cas.web.flow.TerminateSessionAction"
        c:cas-ref="centralAuthenticationService"
        c:tgtCookieGenerator-ref="ticketGrantingTicketCookieGenerator"
        c:warnCookieGenerator-ref="warnCookieGenerator"/>
首先分析org.jasig.cas.web.flow.TerminateSessionAction類的terminate()方法:
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類結構: