1. 程式人生 > >Cas單點登入的簡單瞭解

Cas單點登入的簡單瞭解

最近剛入職一家創業公司,是做物流倉庫管理服務的,所包含的系統以及模組還是挺多的,同時業務也比較複雜,感覺能得到不少的鍛鍊 。之前就對SSO單點登入比較感興趣,剛好公司用了cas單點登入,所以自己就簡單的瞭解了一下,後面有了實戰經歷,再給大家分享,今天就給大家簡單的介紹下cas單點登入的一個大致原理。
首先,貼一張圖介紹一下大致的過程,如下:
這裡寫圖片描述
下面,筆者將分一下幾個步驟進行介紹:

一、https以及hosts檔案配置

由於cas伺服器要求https協議,所以我們得配置伺服器支援https協議,那麼也就需要證書,這裡我們使用jdk自帶的keytool來生成證書,然後再配置到伺服器,另外sso client所在的伺服器需要用jdk匯入證書即可,這裡關於證書的生成和匯入不做介紹,大家可以自行搜尋資料。
筆者這裡使用的是tomcat伺服器,當然也可以使用resin、jetty等伺服器。tomcat https配置只需要開啟server.xml中的https配置即可,如下:

 <Connector port="8443" protocol="org.apache.coyote.http11.Http11Protocol"
               maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
               keystoreFile="d:/sso/ssodemo.keystore" keystorePass="qykpwd"
               clientAuth="false" sslProtocol="TLS" URIEncoding="UTF-8"
/>

為了模仿不同域下的單點登入,這裡我們修改下系統的hosts檔案,新增以下內容:

127.0.0.1    cas.qiyongkang.org
127.0.0.1    app1.qiyongkang.org
127.0.0.1    app2.qiyongkang.org

二、cas server端部署

這裡cas server的下載地址如下:http://developer.jasig.org/cas/cas-server-3.4.11-release.zip,下載後大家可以匯入到eclipse,這是一個maven專案,如下:
這裡寫圖片描述,不用修改啥配置,然後啟動tomcat 訪問可以看到:
這裡寫圖片描述


這裡,伺服器預設的驗證使用者名稱和密碼都是admin,當然大家也可以根據api修改相應的介面和登入邏輯。

三、sso client1配置

客戶端的maven依賴如下:

<dependency>
       <groupId>org.jasig.cas.client</groupId>
       <artifactId>cas-client-core</artifactId>
       <version>3.2.1</version>
    </dependency>

我們只需建立一個新的webapp,然後加上依賴,配置下web.xml即可,如下:

<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
  <display-name>Archetype Created Web Application</display-name>

   <listener>
        <listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class>
    </listener>

    <!-- 登出 -->
    <filter>
        <filter-name>CAS Single Sign Out Filter</filter-name>
        <filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>CAS Single Sign Out Filter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <!-- 沒有區域性會話,就重定向到cas伺服器登入頁面 -->
    <filter>
        <filter-name>CAS Filter</filter-name>
        <filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class>
        <init-param>
            <param-name>casServerLoginUrl</param-name>
            <param-value>https://cas.qiyongkang.org:8443/cas/login</param-value>
        </init-param>
        <init-param>
            <param-name>serverName</param-name>
            <param-value>http://app1.qiyongkang.org:1111</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>CAS Filter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <!-- ticket校驗 -->
    <filter>
        <filter-name>CAS Validation Filter</filter-name>
        <filter-class>
            org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter</filter-class>
        <init-param>
            <param-name>casServerUrlPrefix</param-name>
            <param-value>https://cas.qiyongkang.org:8443/cas</param-value>
        </init-param>
        <init-param>
            <param-name>serverName</param-name>
            <param-value>http://app1.qiyongkang.org:1111</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>CAS Validation Filter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <filter>
        <filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>
        <filter-class>org.jasig.cas.client.util.HttpServletRequestWrapperFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <filter>
        <filter-name>CAS Assertion Thread Local Filter</filter-name>
        <filter-class>org.jasig.cas.client.util.AssertionThreadLocalFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>CAS Assertion Thread Local Filter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

</web-app>

然後,為了方便client web使用jetty外掛啟動,訪問如下:
這裡寫圖片描述
可以看到,直接跳到了cas伺服器。

四、sso client2配置

客戶端2和客戶端1一樣,只是把埠改成了2222,這裡就不贅述了。

五、單點過程演示

我們輸入admin/admin登入可以看到,如下:
這裡寫圖片描述,然後直接訪問client2 wbapp,如下:
這裡寫圖片描述,直接登入成功了,無需再登入。

六、過程分析

首先,筆者把cas伺服器的日誌貼出來:

2017-04-12 23:24:20,582 INFO [org.jasig.cas.authentication.AuthenticationManagerImpl] - <AuthenticationHandler: org.jasig.cas.authentication.handler.support.SimpleTestUsernamePasswordAuthenticationHandler successfully authenticated the user which provided the following credentials: [username: admin]>
2017-04-12 23:24:20,584 INFO [org.jasig.cas.authentication.AuthenticationManagerImpl] - <Resolved principal admin>
2017-04-12 23:24:20,584 INFO [org.jasig.cas.authentication.AuthenticationManagerImpl] - <Principal found: admin>
2017-04-12 23:24:20,587 INFO [com.github.inspektr.audit.support.Slf4jLoggingAuditTrailManager] - <Audit trail record BEGIN
=============================================================
WHO: [username: admin]
WHAT: supplied credentials: [username: admin]
ACTION: AUTHENTICATION_SUCCESS
APPLICATION: CAS
WHEN: Wed Apr 12 23:24:20 CST 2017
CLIENT IP ADDRESS: 127.0.0.1
SERVER IP ADDRESS: 127.0.0.1
=============================================================

>
2017-04-12 23:24:20,592 INFO [com.github.inspektr.audit.support.Slf4jLoggingAuditTrailManager] - <Audit trail record BEGIN
=============================================================
WHO: [username: admin]
WHAT: TGT-1-BbjBIU5hpzURziFCyPjcZ9nDxuG6KKnvE4WqSkoDFjJEEj9iVn-cas
ACTION: TICKET_GRANTING_TICKET_CREATED
APPLICATION: CAS
WHEN: Wed Apr 12 23:24:20 CST 2017
CLIENT IP ADDRESS: 127.0.0.1
SERVER IP ADDRESS: 127.0.0.1
=============================================================

>
2017-04-12 23:24:20,597 INFO [org.jasig.cas.CentralAuthenticationServiceImpl] - <Granted service ticket [ST-1-W1rPACHcF7FR1kVwDAHW-cas] for service [http://app1.qiyongkang.org:1111/app1/] for user [admin]>
2017-04-12 23:24:20,598 INFO [com.github.inspektr.audit.support.Slf4jLoggingAuditTrailManager] - <Audit trail record BEGIN
=============================================================
WHO: admin
WHAT: ST-1-W1rPACHcF7FR1kVwDAHW-cas for http://app1.qiyongkang.org:1111/app1/
ACTION: SERVICE_TICKET_CREATED
APPLICATION: CAS
WHEN: Wed Apr 12 23:24:20 CST 2017
CLIENT IP ADDRESS: 127.0.0.1
SERVER IP ADDRESS: 127.0.0.1
=============================================================

>
2017-04-12 23:24:21,134 INFO [com.github.inspektr.audit.support.Slf4jLoggingAuditTrailManager] - <Audit trail record BEGIN
=============================================================
WHO: audit:unknown
WHAT: ST-1-W1rPACHcF7FR1kVwDAHW-cas
ACTION: SERVICE_TICKET_VALIDATED
APPLICATION: CAS
WHEN: Wed Apr 12 23:24:21 CST 2017
CLIENT IP ADDRESS: 127.0.0.1
SERVER IP ADDRESS: 127.0.0.1
=============================================================

>
2017-04-12 23:25:38,696 INFO [org.jasig.cas.services.DefaultServicesManagerImpl] - <Reloading registered services.>
2017-04-12 23:25:38,696 INFO [org.jasig.cas.services.DefaultServicesManagerImpl] - <Loaded 4 services.>
2017-04-12 23:27:38,696 INFO [org.jasig.cas.services.DefaultServicesManagerImpl] - <Reloading registered services.>
2017-04-12 23:27:38,696 INFO [org.jasig.cas.services.DefaultServicesManagerImpl] - <Loaded 4 services.>
2017-04-12 23:27:41,241 INFO [org.jasig.cas.CentralAuthenticationServiceImpl] - <Granted service ticket [ST-2-ekj4xkMWDJPP0cxAoCug-cas] for service [http://app2.qiyongkang.org:2222/app2/] for user [admin]>
2017-04-12 23:27:41,242 INFO [com.github.inspektr.audit.support.Slf4jLoggingAuditTrailManager] - <Audit trail record BEGIN
=============================================================
WHO: admin
WHAT: ST-2-ekj4xkMWDJPP0cxAoCug-cas for http://app2.qiyongkang.org:2222/app2/
ACTION: SERVICE_TICKET_CREATED
APPLICATION: CAS
WHEN: Wed Apr 12 23:27:41 CST 2017
CLIENT IP ADDRESS: 127.0.0.1
SERVER IP ADDRESS: 127.0.0.1
=============================================================

>
2017-04-12 23:27:41,702 INFO [com.github.inspektr.audit.support.Slf4jLoggingAuditTrailManager] - <Audit trail record BEGIN
=============================================================
WHO: audit:unknown
WHAT: ST-2-ekj4xkMWDJPP0cxAoCug-cas
ACTION: SERVICE_TICKET_VALIDATED
APPLICATION: CAS
WHEN: Wed Apr 12 23:27:41 CST 2017
CLIENT IP ADDRESS: 127.0.0.1
SERVER IP ADDRESS: 127.0.0.1
=============================================================

再訪問http://app2.qiyongkang.org/app2/,步驟差不多,因為沒有建立區域性會話,所以還是得去認證中心,
但是全域性會話已經存在,只需生成ticket,然後攜帶ticket直接重定向到app2伺服器,後面也一樣,最後app2與瀏覽器建立
自己的區域性會話session,結束。
好了,關於cas單點登入就介紹到這了,筆者也沒深入看原始碼,只是學習了下大致的過程以及思想,後面再深入瞭解,希望給大家帶來點幫助~