單點登錄:英文名稱(Single Sign On),簡稱sso,是目前比較流行的服務於企業業務整合的解決方案之一,SSO 使得在多個應用系統中,用戶只需要登錄一次就可以訪問所有相互信任的應用系統。
然后,引用段話介紹一下cas特性(詳見http://www.360doc.com/content/15/0204/17/21706453_446251626.shtml):
1) 開源的、多協議的SSO解決方案,CAS Server和CAS Client通信支持多協議,如:CAS、Oauth、OpenID、SAML1.1、SAML2.0D等。
2) 支持多種認證機制:Active Directory、JAAS、JDBC、LDAP、X.509 Certificates等。
3) 安全策略:使用票據(Ticket)來實現支持的認證協議;
4) 支持多種客戶端:Java、.Net、PHP、Perl、Apache、 uPortal等。
5) 支持授權:可以決定哪些服務可以請求和驗證服務票據(Service Ticket)。
6) 提供高可用性:通過把認證過的狀態數據存儲在TicketRegistry組件中,這些組件有很多支持分布式環境的實現。
CAS包含CAS Server和CAS Client兩個部分。下面我們看一看他的運行原理,首先借用一張cas常用的基礎協議流程圖

大致流程是,在客戶機在在訪問cas客戶端時都需要請求服務端驚醒身份驗證,再驗證未通過是時,會被重定向至cas的服務端進行登陸,而后再次驗證,通過之后又重定向到客戶端界面。這里只是一些文字描述,真正的實現我們接下來看如何操作:
首先,我需要介紹一下,配置cas的服務端有兩種方式:一種是http方式,另一種是https方式。筆者這里將演示如何配置https方式的cas服務端。
第一步我們肯定是需要准備我們的原材料:筆者這里用的是cas-server-4.0.7.war,tomcat7
首先需要的是導出你的證書,使用jdk的keytool工具,命令如下:
keytool -genkey -alias castest -keyalg RSA -keystore C:/key/casKey.keystore
這里是生成你的keystore文件,C:/key/casKey.keystore是指文件生成路徑,即c盤下的key文件夾下生成casKey.store文件,注意文件夾一定要存在這里你會輸入你的證書信息,注意口令為你的密碼,用戶名將為你后期配置服務端請求的域名

第二步導出crt文件:
keytool -export -file C:/key/casKey.crt -alias castest -keystore C:/key/casKey.keystore

執行完這兩步,你將生成兩個文件:

第三步:將生成的證書導入你的運行jdk中:
keytool -import -keystore "C:/Program Files/Java/jdk1.8.0_131/jre/lib/security/cacerts" -file C:/key/casKey.crt -alias castest
這里需要注意的是你的路徑一定要為你的jdk->jre->lib->security,如果你的路徑下存在此文件,則需要將其刪除,再執行導入,密鑰庫口令默認為changeit

然后將生成的證書文件文件拷貝至jdk->bin下,在c://windows/System32/drivers/etc/hosts文件中添加你的域名映射,沒有該文件需創建一個hosts文件,添加內容如下
127.0.0.1 sso.castest.com
接下來就開始配置tomcat環境了,首先將你的cas-server-4.0.7.war拷貝至tomcat的webapps下,改名為cas.war。打開tomcat->conf->server.xml,找到如下內容:

將其反注釋,修改為:
<Connector port="8086" protocol="HTTP/1.1" SSLEnabled="true" maxThreads="150" scheme="https" secure="true" clientAuth="false" sslProtocol="TLS" keystoreFile="C:/key/casKey.keystore" keystorePass="casDemo" />
這里需要注意:keystoreFile為你第一步生成的keystore文件的位置,keystorePass為你第一步輸入的口令密碼,不是changeit
接下來做個測試,啟動tomcat,輸入地址https://sso.castest.com:8086/cas/,出現如下界面

添加好信任之后,進入如下界面,則說明服務端配置成功:

ok,以上步驟如果沒有成功,請仔細檢查之前步驟。成功了之后,恭喜,那就可以進入客戶端端的配置了,首先,下載服務端架包,這里用的是cas-client-core-3.2.1.jar,然后准備一個測試tomcat,用來測試單點登錄,創建一個web項目,取名為casDemo001
pom.xml加入如下:
<dependency>
<groupId>org.jasig.cas.client</groupId>
<artifactId>cas-client-core</artifactId>
<version>3.2.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/commons-collections/commons-collections -->
<dependency>
<groupId>commons-collections</groupId>
<artifactId>commons-collections</artifactId>
<version>3.2.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/commons-logging/commons-logging -->
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
<version>1.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/javax.servlet/servlet-api -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
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"> <!-- ======================== 單點登錄開始 ======================== --> <!-- 用於單點退出,該過濾器用於實現單點登出功能,可選配置--> <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>CASFilter</filter-name> <filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class> <init-param> <param-name>casServerLoginUrl</param-name> <param-value>https://sso.castest.com:8086/cas/login</param-value> </init-param> <!-- 指定客戶端的域名和端口,是指客戶端應用所在機器而不是 CAS Server 所在機器以下配置表示, 系統部署在域名為shirui-55的機器上,端口為80 --> <init-param> <param-name>serverName</param-name> <param-value>http://localhost:8111</param-value> </init-param> </filter> <filter-mapping> <filter-name>CASFilter</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://sso.castest.com:8086/cas</param-value> </init-param> <init-param> <param-name>serverName</param-name> <param-value>http://localhost:8111</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> <!-- ======================== 單點登錄結束 ======================== --> <!-- session超時定義,單位為分鍾 --> <session-config> <session-timeout>2</session-timeout> </session-config> </web-app>
這里需注意的是關於兩個casServer的url的編寫
啟動tomcat(需要修改端口號,要不然后報端口號被占用錯誤,這里修改為8111,當然你可以根據自己的愛好修改,對這里來說無關痛癢),將項目運行,啟動成功后輸入地址:localhost:8111/casDemo001/,出現如下界面

這就證明配置成功了,你的請求已經被攔截,並且正確的跳到了你的cas服務器登錄界面,輸入賬號密碼:casuser Mellon(這是cas默認的登錄賬戶,配置數據驗證的話下一篇博文會講述),登陸后出現如下界面:

然后刷新cas服務端的界面,出現如下圖界面:

至此,cas服務端與客戶端的配置已經完成,服務端文件下載鏈接鏈接:https://pan.baidu.com/s/1qY1H0aK 密碼:7e52
