CAS是YALE大學發起的一個開源項目,旨在爲web應用系統提供一種可靠的單點登陸方法。它主要分爲client和server端,server端負責對用戶的認證工做,client端負責處理對客戶端受保護的資源的訪問請求,CAS的原理以下圖所示:php
上述的6個步驟解釋以下:html
1.用戶經過browser請求cas client A端的資源。java
2.client A端發現用戶未登陸(client沒有收到ST),redirect到cas server,而且把用戶請求服務的url發送給server;server發現用戶瀏覽器中沒有TGC(Ticket Granting Cookie),就跳轉到登陸頁面。mysql
3.用戶在登陸頁面登陸並登陸成功。web
4.server在用戶的瀏覽器中設置一個TGC(Ticket Granting Cookie),而且在server端保存一個TGT(Ticket Granting Tciket),而後把用戶重定向到{client A網址+ST(Service Ticket)},其中ST是由TGT生成的。spring
5.client A端經過GET的方法收到ST,向server端驗證這個ticket的有效性,這一步主要是爲了防止惡意用{client網址+杜撰的ST}來訪問client A,因此雖然ST是server發送給client A的,client A仍然須要向server驗證其有效性。sql
6.ticket有效,server端返回ticket對應的用戶的用戶名,client A端爲用戶提供請求的服務。數據庫
上述是未登陸的用戶訪問client A的過程,用戶經過以上步驟已經登陸了CAS系統,此時他訪問CAS系統中信任的client B端,是不用登陸的,實現步驟以下:
1.1.用戶經過browser請求cas client B端的資源。apache
2.client B端發現沒有收到ST,redirect到cas server,而且把用戶請求服務的url發送給server;server發現用戶瀏覽器中有TGC(Ticket Granting Cookie),驗證該TGC後,用server端存儲的TGT生成一個ST。瀏覽器
3.server把用戶重定向到{client B網址+ST(Service Ticket)}。
4.client B端經過GET的方法收到ST,向server端驗證這個ticket的有效性.
5.ticket有效,server端返回ticket對應的用戶的用戶名,client B端爲用戶提供請求的服務,這樣用戶就不用再次登陸就能夠訪問到client B了。
因此從上述過程當中,能夠看到client端既不能接觸到用戶的用戶名密碼,也不能接觸到用戶的憑證TGT或者TGC,它只作兩件事情:若是用戶的請求裏有ST,那麼就向服務器驗證ST的有效性;若是用戶的請求裏沒有ST,那麼就把用戶重定向到cas server;
cas server全權負責管理用戶的用戶名和密碼,若是發現用戶的瀏覽器裏面有有效的TGC,就生成ST把用戶重定向到client端;若是用戶瀏覽器裏面沒有TGC或者TGC無效,就讓用戶從新登陸,而後在用戶的瀏覽器裏面設置新的TGC。而server和用戶瀏覽器之間的交互是https安全協議,這樣就保證了用戶的用戶名密碼的安全性。
本文記錄server端的搭建過程。
1.安裝JDK
2.搭建TOMCAT:
雙擊%TOMCAT_PATH%/bin/startup.bat啓動tomcat
瀏覽器打開http://localhost:8080,若顯示以下界面,則配置成功:
3.配置tomcat使用https協議
(1)生成安全證書
cd到%JAVA_HOME%/bin/目錄下,執行一下命令
keytool -genkeypair -alias "tomcat" -keyalg "RSA" -keystore "g:\tomcat.keystore"
其中"g:\tomcat.keystore"是保存生成證書的路徑和名稱。
在接下來的操做中,要注意的是「您的名字和姓氏是什麼?」這裏要回答域名,好比我是在本機搭建tomcat,因此回答localhost,以下圖所示:
其餘的隨便填就行了,密碼固然要記住,我這裏用的是"tomcat"做爲密碼,後面配置的時候要用到的。
上述命令執行完後就能夠在g:\下看到證書tomcat.keystore了。
(2)配置tomcat
在%TOMCAT_PATH%/conf下找到server.xml文件,定位到下面的代碼上:
<!-- <Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true" maxThreads="150" scheme="https" secure="true" clientAuth="false" sslProtocol="TLS" /> -->
去掉註釋,而後把它修改爲下面的代碼:
<Connector port="8443" protocol="org.apache.coyote.http11.Http11Protocol" maxThreads="150" SSLEnabled="true" scheme="https" secure="true" keystoreFile="G:\tomcat.keystore" keystorePass="tomcat" clientAuth="false" sslProtocol="TLS" />
各項的含義見下表:
而後在瀏覽器裏面打開https://localhost:8443,出現以下界面就說明配置tomcat使用https成功了:
4.配置CAS Server
到CAS主頁上下載cas server,我這裏下載的並非最新版,是cas-server-3.5.2-release.zip;而後解壓,到\cas-server-3.5.2\modules目錄下找到cas-server-webapp-3.5.2.war,把它拷貝到\apache-tomcat-7.0.56\webapps下而且重命名爲cas.war,重啓tomcat(雙擊\apache-tomcat-7.0.56\bin\startup.bat),用瀏覽器打開https://localhost:8443/cas/login,若是出現一下界面則說明CAS Server配置成功:
5.與MYSQL鏈接
目前配置好的CAS的用戶名和密碼驗證十分簡單,既只要用戶名和密碼相同就能夠登陸了。但在實際應用中咱們的用戶名密碼經常是保存在數據庫裏面的,因此咱們但願實現從數據庫裏面驗證用戶名和密碼。操做步驟以下:
(1)用phpMyAdmin在MYSQL中建立用戶名密碼的表,這裏新建一個數據庫casuserdatabase,建立一張表app_user來存放用戶名密碼信息,而後插入兩條測試用的用戶名密碼,sql語句以下;
CREATE DATABASE casuserdatabase; USE casuserdatabase; CREATE TABLE app_user (username varchar(30), password varchar(45) , primary key (username)); INSERT INTO app_user (username,password) values ('test01','psw01'); INSERT INTO app_user (username,password) values('test02','psw02');
(2)到這裏下載mysql-connector-java-5.1.22,其餘版本的我沒有嘗試過,不知道可不能夠。解壓,咱們只須要文件夾裏面的mysql-connector-java-5.1.22-bin.jar包。
到cas-server-3.5.2\modules\目錄下找到cas-server-support-jdbc-3.5.2.jar。
把上述兩個包拷貝到apache-tomcat-7.0.56\webapps\cas\WEB-INF\lib\目錄下。
(3)配置apache-tomcat-7.0.56\webapps\cas\WEB-INF\目錄下的deployerConfigContext.xml文件:
首先增長一個datasource,經過增長一下的代碼實現:
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver"></property> <property name="url" value="jdbc:mysql://localhost/casuserdatabase"/> <property name="username" value="sunshineatnoon"/> <property name="password" value="49531218"/> </bean>
而後改變認證方式,定位到以下代碼:
<bean
class="org.jasig.cas.authentication.handler.support.SimpleTestUsernamePasswordAuthenticationHandler" />
把它註釋掉,換成:
<bean class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler"> <property name="dataSource" ref="dataSource" /> <property name="sql" value="select password from app_user where userName=?" /> </bean>
其中<property name="sql" value="select password from app_user where userName=?" /> 中app_user是我存放用戶名和密碼的表,須要根據實際狀況而定。
注意這裏datasource放在註釋掉的那行代碼所在的</list>外面,大概相對位置見下面的代碼,不然會報錯:
<!--bean class="org.jasig.cas.authentication.handler.support.SimpleTestUsernamePasswordAuthenticationHandler" /--> <bean class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler"> <property name="dataSource" ref="dataSource" /> <property name="sql" value="select password from app_user where userName=?" /> </bean> </list> </property> </bean> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver"></property> <property name="url" value="jdbc:mysql://localhost/casuserdatabase"/> <property name="username" value="sunshineatnoon"/> <property name="password" value="49531218"/> </bean>
(4)重啓tomcat,再次到登陸頁面https://localhost:8443/cas/login上,就能夠用數據庫中的用戶名和密碼登陸了,好比這裏用上面設置的"test01","psw01"登陸:
到這裏還有個bug就是登陸的時候老是會清空一次登陸框,第二次才能登上去,研究下這個bug怎麼解決再說。
還有一個是目前我還不知道怎麼登出,因而就用最笨的方法,把瀏覽器的cookie刪掉,刷新登陸頁面,就算登出啦。
參考資料
[1]配置tomcat使用https:http://ln-ydc.iteye.com/blog/1330674
[2]與mysql鏈接配置:http://blog.sina.com.cn/s/blog_3fc815b30100ihtr.html
[3]mysql-connector-java-5.1.22下載:http://6881116.blog.51cto.com/6871116/1190148