使用CAS實現單點登入

SIMBA1949發表於2018-02-26

使用CAS實現單點登入

CAS官網:https://www.apereo.org/

CAS下載地址:https://github.com/apereo/cas/releases

CAS-Client下載地址:http://developer.jasig.org/cas-clients/

CAS-Server下載地址:http://developer.jasig.org/cas/

CAS-Overlay-Template下載地址:https://github.com/apereo/cas-overlay-template

CAS原理解析

這裡寫圖片描述

演示環境

  • win10 64位

  • JDK 1.8.0_152

  • Tomcat 8.5.28

  • cas-server-4.0.0

  • cas-client-3.3.3

這裡寫圖片描述

  • demo.simba.com:對應部署cas server的tomcat,虛擬域名還用於證照的生成
  • app1.simba.com:對應部署app1的tocmat
  • app2.simba.com:對應部署app2的tocmat

安全證照配置

生成證照

開啟命令視窗,輸入下面命令:

keytool -genkey -v -alias tomcat -keyalg RSA -keypass 123456 -storepass 123456 -keystore D:/sso/keystore/mykey.keystore
  • -alias tomcat:取別名為tomcat
  • -keyalg RSA:指定金鑰的演算法為RSA
  • -keypass 123456: 指定別名條目的密碼(私鑰的密碼)
  • -storepass 123456:指定金鑰庫的密碼(獲取keystore資訊所需的密碼)
  • -keystore D:/sso/keystore/mykey.keystore:生成一個名為tomcat的證照,放在D盤下的sso\keystore目錄下

執行後如圖:

這裡寫圖片描述

D:/sso/keystore目錄下會多出一個mykey.keystore檔案

這裡寫圖片描述

匯出證照

執行下面命令,輸入金鑰庫口令

keytool -export -trustcacerts -alias tomcat -file D:/sso/keystore/mykey.cer  -keystore D:/sso/keystore/mykey.keystore

執行結果:

這裡寫圖片描述

執行後D:/sso/keystore目錄下會多出一個mykey.cer檔案

這裡寫圖片描述

匯入到JDK中

匯入到jdk的安裝目錄C:\Program Files (x86)\Java\jdk1.8.0_152\jre\lib\security下的cacerts檔案中

這裡寫圖片描述

執行下面命令


keytool -import -trustcacerts -alias tomcat -file D:/sso/keystore/mykey.cer -keystore "C:\Program Files (x86)\Java\jdk1.8.0_152\jre\lib\security\cacerts"

這裡寫圖片描述

證照新增出現錯誤,系統拒絕訪問,更改java檔案屬性的所有許可權即可

更改後如圖

這裡寫圖片描述

檢視JDK中的證照列表,執行下面命令

keytool -list -keystore "C:\Program Files (x86)\Java\jdk1.8.0_152\jre\lib\security\cacerts"

這裡寫圖片描述

Tomcat配置

修改tocmat解壓目錄下conf下的server.xml配置

並新增證照配置

<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
               maxThreads="150" scheme="https" secure="true"
               keystoreFile="D:/sso/keystore/mykey.keystore" keystorePass="123456"
               clientAuth="false" sslProtocol="TLS" URIEncoding="UTF-8">
</Connector>

這裡寫圖片描述

CAS-Server的部署

將CAS-Server解壓目錄下modules資料夾下的cas-server-webapp-4.0.0.war拷貝到tomcat的webapps下面,並該名為cas

啟動tomcat,可以訪問到,說明部署成功

這裡寫圖片描述

這裡寫圖片描述

在cas/WEB-INF/deployerConfigContext.xml中有原始登入賬號和密碼,填寫賬號和密碼登入即可

這裡寫圖片描述

登入後

這裡寫圖片描述

CAS-Client的部署

借用tomcat預設自帶的webapps\examples作為演示簡單的web專案

安裝app1、app2倆個tomcat,修改埠,並訪問成功即可

這裡寫圖片描述

這裡寫圖片描述

app1的部署

將cas-client-3.3.3/modules目錄下的cas-client-core-3.3.3.jar拷貝到app1\apache-tomcat-8.5.28\webapps\examples\WEB-INF\lib目錄中

這裡寫圖片描述

並在app1\apache-tomcat-8.5.28\webapps\examples\WEB-INF\web.xml新增

<!-- ======================== 單點登入開始 ======================== -->
        <!-- 用於單點退出,該過濾器用於實現單點登出功能,可選配置-->
        <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>

        <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://demo.simba.com:8443/cas/login</param-value>
            </init-param>
            <init-param>
                <param-name>serverName</param-name>
                <param-value>http://app1.simba.com:18080</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://demo.simba.com:8443/cas</param-value>
            </init-param>
            <init-param>
                <param-name>serverName</param-name>
                <param-value>http://app1.simba.com:18080</param-value>
            </init-param>
        </filter>
        <filter-mapping>
            <filter-name>CAS Validation Filter</filter-name>
            <url-pattern>/*</url-pattern>
        </filter-mapping>

        <!--
            該過濾器負責實現HttpServletRequest請求的包裹,
            比如允許開發者通過HttpServletRequest的getRemoteUser()方法獲得SSO登入使用者的登入名,可選配置。
        -->
        <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>

    <!--
        該過濾器使得開發者可以通過org.jasig.cas.client.util.AssertionHolder來獲取使用者的登入名。
        比如AssertionHolder.getAssertion().getPrincipal().getName()。
        -->
        <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>

        <!-- ======================== 單點登入結束 ======================== -->

啟動tomcat,發現如下錯誤

這裡寫圖片描述

原因是缺少slf4j-api的jar包,將slf4j-api-1.7.25.jar新增到釋出專案的lib中即可

這裡寫圖片描述

app2的部署

將cas-client-3.3.3/modules目錄下的cas-client-core-3.3.3.jar拷貝到app2\apache-tomcat-8.5.28\webapps\examples\WEB-INF\lib目錄中

這裡寫圖片描述

並在app2\apache-tomcat-8.5.28\webapps\examples\WEB-INF\web.xml新增

<!-- ======================== 單點登入開始 ======================== -->
        <!-- 用於單點退出,該過濾器用於實現單點登出功能,可選配置-->
        <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>

        <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://demo.simba.com:8443/cas/login</param-value>
            </init-param>
            <init-param>
                <param-name>serverName</param-name>
                <param-value>http://app2.simba.com:28080</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://demo.simba.com:8443/cas</param-value>
            </init-param>
            <init-param>
                <param-name>serverName</param-name>
                <param-value>http://app2.simba.com:28080</param-value>
            </init-param>
        </filter>
        <filter-mapping>
            <filter-name>CAS Validation Filter</filter-name>
            <url-pattern>/*</url-pattern>
        </filter-mapping>

        <!--
            該過濾器負責實現HttpServletRequest請求的包裹,
            比如允許開發者通過HttpServletRequest的getRemoteUser()方法獲得SSO登入使用者的登入名,可選配置。
        -->
        <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>

    <!--
        該過濾器使得開發者可以通過org.jasig.cas.client.util.AssertionHolder來獲取使用者的登入名。
        比如AssertionHolder.getAssertion().getPrincipal().getName()。
        -->
        <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>

        <!-- ======================== 單點登入結束 ======================== -->

單點登入演示

只要登入cas-server,app1和app2能夠訪問到具體的網址
這裡寫圖片描述

這裡寫圖片描述

這裡寫圖片描述

只要登出或者未登入cas-server,app1和app2必須跳轉到cas-server的登入介面

(注:該頁面是重定向,無法顯示原網址)

這裡寫圖片描述

這裡寫圖片描述

這裡寫圖片描述

相關文章