CAS單點登錄系列:
CAS 5.1.x 的搭建和使用(一)—— 通過Overlay搭建服務端 CAS 5.1.x 的搭建和使用(二)—— 通過Overlay搭建服務端-其它配置說明 CAS 5.1.x 的搭建和使用(三)—— 官方示例來熟悉客戶端搭建 CAS 5.1.x 的搭建和使用(四)—— 配置使用HTTP協議訪問的服務端
這里主要有兩件事要做:
第一個就是給客戶端的jre添加和服務端對應的證書
之前我們已經生成了一個keystore,我們就直接使用這個keystore生成一個證書,命令如下:
keytool -exportcert -alias cas -keystore D:/liuyx.keystore -file D:/liuyx.keystore.cer -storepass 123456
然后把這個證書導入jre的

注意,這個jre一定要是你跑客戶端的Tomcat的那個jre,
這里我的目錄是:C:/Java/jdk1.8.0_91/jre/lib/security/cacerts,剛剛導出的證書的目錄是D:/liuyx.keystore.cer
那么我的命令就是:
keytool -import -alias cas -keystore C:/Java/jdk1.8.0_91/jre/lib/security/cacerts -file D:/liuyx.keystore.cer
證書庫的密碼是:changeit
導入完我們可以看一下導入的結果:
keytool -list -keystore C:/Java/jdk1.8.0_91/jre/lib/security/cacerts
密碼同上,可以看到一堆證書,其中有一個“別名”是cas的,日期是今天,就是我們剛剛導進去的。
當我們做完這一切CAS實驗后,也許你會想要刪掉這個證書,可以使用這個命令:
keytool -delete -alias cas -keystore C:/Java/jdk1.8.0_91/jre/lib/security/cacerts
接下來就是跑官網的示例了
官網例子地址:
https://github.com/cas-projects/cas-sample-java-webapp
我們先把它下下來,結構如下

可以看到里面內置了jetty,不過我是通過idea中的Tomcat運行的,我把它導入了idea。
然后就是我們的正題了,配置修改:
1、pom.xml
在pom里面加上以下內容:
<dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.25</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.25</version> </dependency>
2、web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> <!--用來控制cas識別的session的保存,以及判斷是否是登出請求--> <filter> <filter-name>CAS Single Sign Out Filter</filter-name> <filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class> <init-param> <param-name>casServerUrlPrefix</param-name> <!--這個地址要和keystore中的CN一致,端口無所謂,域名必須一致,前邊我在hosts里面配置了這個域名映射,所以實際上訪問的是127.0.0.1--> <param-value>https://cas.example.org:8443</param-value> </init-param> </filter> <listener> <listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class> </listener> <!--用來跳轉登錄--> <filter> <filter-name>CAS Authentication Filter</filter-name> <filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class> <init-param> <param-name>casServerLoginUrl</param-name> <!--這個地址要和keystore中的CN一致,端口無所謂,域名必須一致,前邊我在hosts里面配置了這個域名映射,所以實際上訪問的是127.0.0.1--> <param-value>https://cas.example.org:8443/login</param-value> </init-param> <init-param> <param-name>serverName</param-name> <!--這是你客戶端的部署地址,認證時會帶着這個地址,認證成功后會跳轉到這個地址--> <param-value>http://localhost:8080</param-value> </init-param> </filter> <!--用來驗證ticket--> <filter> <filter-name>CAS Validation Filter</filter-name> <filter-class>org.jasig.cas.client.validation.Cas30ProxyReceivingTicketValidationFilter</filter-class> <init-param> <param-name>casServerUrlPrefix</param-name> <!--這個地址要和keystore中的CN一致,端口無所謂,域名必須一致,前邊我在hosts里面配置了這個域名映射,所以實際上訪問的是127.0.0.1--> <param-value>https://cas.example.org:8443</param-value> </init-param> <init-param> <param-name>serverName</param-name> <!--這是你客戶端的部署地址,驗證ticket成功后會跳轉到這個地址--> <param-value>http://localhost:8080</param-value> </init-param> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> <init-param> <param-name>redirectAfterValidation</param-name> <param-value>true</param-value> </init-param> <init-param> <param-name>useSession</param-name> <param-value>true</param-value> </init-param> <init-param> <param-name>authn_method</param-name> <param-value>mfa-duo</param-value> </init-param> </filter> <!--用來封裝request--> <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 Single Sign Out Filter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <filter-mapping> <filter-name>CAS Validation Filter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <filter-mapping> <filter-name>CAS Authentication Filter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <filter-mapping> <filter-name>CAS HttpServletRequest Wrapper Filter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <welcome-file-list> <welcome-file> index.jsp </welcome-file> </welcome-file-list> </web-app>
總共四個過濾器和一個監聽器,大部分都在文件內容中注釋說明了,自己看一下吧。
客戶端應用跑起來,會先跳轉到CAS服務器登錄頁,登錄成功后會跳轉到首頁index.jsp,里面就是獲取了所有你可以從CAS服務器獲取的屬性,如果你前面沒有配置多屬性獲取,那么只有一個默認的id,和一些其他cas自帶的屬性。
關於如何在代碼里獲得這些屬性,這個index.jsp 的代碼里已經寫的非常清楚了,自己去看一下即可。
最后建議大家做完這些之后自己打開谷歌瀏覽器的F12,勾選上Preserve log

通過正常的登陸來看一下頁面跳轉流程,結合下邊這個地址,弄明白TGC、TGT、ST三個概念:
