CAS 是 Yale 大學發起的一個開源項目,旨在爲 Web 應用系統提供一種可靠的單點登陸方法,CAS 在 2004 年 12 月正式成爲 JA-SIG 的一個項目。CAS 具備如下特色:java
- 開源的企業級單點登陸解決方案。
- CAS Server 爲須要獨立部署的 Web 應用。
- 支持很是多的客戶端(這裏指單點登陸系統中的各個 Web 應用),包括 Java, .Net, PHP, Perl, Apache, uPortal, Ruby 等。
CAS 原理和協議
從結構上看,CAS 包含兩個部分: CAS Server 和 CAS Client。CAS Server 須要獨立部署,主要負責對用戶的認證工做;CAS Client 負責處理對客戶端受保護資源的訪問請求,須要登陸時,重定向到 CAS Server。圖1 是 CAS 最基本的協議過程:
圖 1. CAS 基礎協議mysql
CAS Client 與受保護的客戶端應用部署在一塊兒,以 Filter 方式保護受保護的資源。對於訪問受保護資源的每一個 Web 請求,CAS Client 會分析該請求的 Http 請求中是否包含 Service Ticket,若是沒有,則說明當前用戶還沒有登陸,因而將請求重定向到指定好的 CAS Server 登陸地址,並傳遞 Service (也就是要訪問的目的資源地址),以便登陸成功事後轉回該地址。用戶在第 3 步中輸入認證信息,若是登陸成功,CAS Server 隨機產生一個至關長度、惟1、不可僞造的 Service Ticket,並緩存以待未來驗證,以後系統自動重定向到 Service 所在地址,併爲客戶端瀏覽器設置一個 Ticket Granted Cookie(TGC),CAS Client 在拿到 Service 和新產生的 Ticket 事後,在第 5,6 步中與 CAS Server 進行身份合適,以確保 Service Ticket 的合法性。web
在該協議中,全部與 CAS 的交互均採用 SSL 協議,確保,ST 和 TGC 的安全性。協議工做過程當中會有 2 次重定向的過程,可是 CAS Client 與 CAS Server 之間進行 Ticket 驗證的過程對於用戶是透明的。spring
另外,CAS 協議中還提供了 Proxy (代理)模式,以適應更加高級、複雜的應用場景,具體介紹能夠參考 CAS 官方網站上的相關文檔。sql
CAS服務器端配置
配置服務器環境
首先下載必須的軟件:數據庫
Tomcat6.0: http://tomcat.apache.org/download-60.cgi
Windows Service Installerapache
Jdk: http://java.sun.com/javase/downloads/index.jsp
你能夠選擇帶有 jre 的安裝文件或者你機器裏如今有 jre 環境則只須要下載 JDK.
Java SE 6 Update 10 Beta (不帶JRE)
JDK 6 Update 6 (帶JRE)
Java Runtime Environment (JRE) 6 Update 6 (JRE)
下面按步驟來:
1.安裝JDK和JRE
一直下一步到安裝完成,記住JDK安裝的路徑。bootstrap
2.設置JDK相關的環境變量
1).切換到桌面,右鍵點擊「個人電腦」 -> 屬性 -> 高級 -> 如圖 創建一個 JAVA_HOME 環境變量,變量值爲JDK的根目錄。windows
2).和上面同樣的操做,創建 環境變量 CLASSPATH,值爲 「.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar;%JAVA_HOME%\jre\lib\rt.jar」
3).仍是操做環境變量但不是新建,而是編輯。編輯 Path 變量,最變量值最後面加上 ;%JAVA_HOME%\bin;
3.安裝Tomcat
1).一直下一步,中間須要選擇安裝路徑和 JVM 目錄,若是JDK和JRE安裝沒問題,這裏他應該能自動找獲得,不然須要你手動指定一下。 中間什麼也不用管,有一部讓你設置端口,不用動,保持默認的就好了。
2).新增一個 CATALINA_HOME 環境變量,變量值爲你TOMCAT安裝時的根目錄。
3.測試運行服務器
安裝後的bin目錄共有一下幾個文件:
bootstrap.jar
tomcat-juli.jar
tomcat6.exe
tomcat6w.exe
其中tomcat6w.exe是監控tomcat運行的,能夠直接運行,或者縮小到屏幕右下角成爲一個小圖標。
直接運行tomcat6w.exe或者「tomcat6w //ES//」 均可以進入監控配置窗口;
或者運行「tomcat6w //MS//」把它縮小到右下角。
也可用startup.bat和shutdown.bat 來啓動和關閉服務。
web訪問測試
啓動後,能夠經過瀏覽器進行訪問,測試運行是否正常。
用IE或者Firefox等瀏覽器,輸入地址:
http://localhost:8080/ –若是安裝時修改了端口,請把8080用修改後的值替換。
若是可以正常瀏覽到tomcat歡迎信息,就是正確了,不然就要檢查安裝是否正確、防火牆的設置等。
常常遇到的一個問題是端口衝突,最多見的就是80端口被佔用,致使服務沒法正常啓動。若是經過tomcat6 //TS//tomcat6來啓動,立刻就可以發現提示信息。修改一下tomcat6\conf\server.xml中的端口就可以解決。
一般使用80端口的有:
1. IIS服務器,由於在windows服務器上,不少都安裝了IIS,而IIS默認的端口就是80.
2. skype即時聊天工具,skype的能夠穿透防火牆的本領,也是經過佔用80端口實現的。
查看端口占用的命令:
進入windows命令行,輸入:
netstat -an
這個命令返回有4列:protocol協議、local address本機地址、foreign address來訪者地址、status狀態
瀏覽本機地址一列,能夠看到當前主機對外服務的IP地址、端口都有哪些。
若是一臺機器有192.168.1.100和192.168.1.101兩個地址,那麼:
0.0.0.0:80表示這臺機器上全部80端口都被使用
127.0.0.1:80表示127.0.0.1的80被使用,但.100和.101IP地址的80還未使用。
192.168.1.100:80表示.100IP地址的80端口被使用
192.168.1.101:80表示.101IP地址的80端口被使用
部署 CAS Server
CAS Server 是一套基於 Java 實現的服務,該服務以一個 Java Web Application 單獨部署在與 servlet2.3 兼容的 Web 服務器上,另外,因爲 Client 與 CAS Server 之間的交互採用 Https 協議,所以部署 CAS Server 的服務器還須要支持 SSL 協議。當 SSL 配置成功事後,像普通 Web 應用同樣將 CAS Server 部署在服務器上就能正常運行了,不過,在真正使用以前,還須要擴展驗證用戶的接口。
Tomcat配置HTTPS方式
一、開始-〉運行-〉cmd 進入到jdk下的bin目錄
二、輸入以下指令
keytool -v -genkey -alias tomcat -keyalg RSA -keystore d:/tomcat.keystore -validity 36500
附:
d:/tomcat.keystore是將生成的tomcat.keystore放到d盤根目錄下。
「-validity 36500」含義是證書有效期,36500表示100年,默認值是90天
注意若要放到c盤,在win7系統下,須要以管理員身份進入到命令行中進行操做,不然是沒法建立tomcat.keystore的。本例放到d盤下。
如何以管理員身份進入到命令行下呢?開始->搜索框中輸入cmd->等待(注意不回車)->出現cmd.exe->右鍵「以管理員身份運行」便可。
三、輸入keystore密碼
密碼任意,此處以123456爲例,要記住這個密碼,以後在進行server.xml配置時須要使用。
四、輸入名字、組織單位、組織、市、省、國家等信息
注意事項:
A、Enter keystore password:此處須要輸入大於6個字符的字符串
B、「What is your first and last name?」這是必填項,而且必須是TOMCAT部署主機的域名或者IP[如:gbcom.com 或者 10.1.25.251],就是你未來要在瀏覽器中輸入的訪問地址
C、「What is the name of your organizational unit?」、「What is the name of your organization?」、「What is the name of your City or Locality?」、「What is the name of your State or Province?」、「What is the two-letter country code for this unit?」能夠按照須要填寫也能夠不填寫直接回車,在系統詢問「correct?」時,對照輸入信息,若是符合要求則使用鍵盤輸入字母「y」,不然輸入「n」從新填寫上面的信息
D、Enter key password for <tomcat>,這項較爲重要,會在tomcat配置文件中使用,建議輸入與keystore的密碼一致,設置其它密碼也能夠
l 完成上述輸入後,直接回車則在你在第二步中定義的位置找到生成的文件
五、輸入以後會出現確認的提示
此時輸入y,並回車。此時建立完成keystore。
進入到D盤根目錄下能夠看到已經生成的tomcat.xml
六、進入tomcat文件夾
找到conf目錄下的sever.xml並進行編輯
七、編輯
<Connector port=」8443″ protocol=」HTTP/1.1″ SSLEnabled=」true」
maxThreads=」150″ scheme=」https」 secure=」true」
clientAuth=」false」 keystoreFile=」D:/AppServer/Tomcat/apache-tomcat-6.0.32/conf/tomcat.keystore」
keystorePass=」deleiguo」 sslProtocol=」TLS」 />
注:
方框中的keystore的密碼,就是剛纔咱們設置的「123456」.
編輯完成後關閉並保存sever.xml
八、Tomcat啓動成功後,使用https://127.0.0.1:8443 訪問頁面
頁面成功打開即tomcat下的https配置成功。
九、注意事項:
(1) 生成證書的時間,若是IE客戶端所在機器的時間早於證書生效時間,或者晚於有效時間,IE會提示「該安全證書已到期或還未生效」
(2) 若是IE提示「安全證書上的名稱無效或者與站點名稱不匹配」,則是由生成證書時填寫的服務器所在主機的域名「您的名字與姓氏是什麼?」/「What is your first and last name?」不正確引發的
十、遺留問題:
(1)若是AC主機不能經過域名查找,必須使用IP,可是這個IP只有在配置後才能肯定,這樣證書就必須在AC肯定IP地址後才能生成
(2)證書文件只能綁定一個IP地址,假設有10.1.25.250 和 192.168.1.250 兩個IP地址,在證書生成文件時,如使用了10.1.25.250,經過IE就只能使用10.1.25.250 來訪問AC-WEB,192.168.1.250是沒法訪問AC-WEB的。
配置CAS
- 下載cas http://www.ja-sig.org/downloads/cas/cas-server-3.4.2-release.zip
- 安裝cas-server,咱們假定安裝cas-server的服務器爲server1
(1) 將cas-server-3.4.2-release.zip 解壓,將moudels目錄下cas-server-webapp-x.x.war拷貝到tomcat的webapps目錄下,修 更名稱爲cas.war.
(2) 生成server1的安全證書:
keytool -export -alias tomcat -file D:/file.cer -keystore d:/tomcat.keystore -validity 36500
而後輸入d:/tomcat.keystore中的keystore密碼
-file D:/file.cer 即爲生成的cer文件,可直接點擊安裝
(3) 從新啓動server1上的tomcat,檢驗cas配置是否成功,訪問https://ip或域名:8443/cas/login,若是能看到cas的登陸頁面則表示配置成功。
cas客戶端配置
一、準備CAS的PHP庫和相關庫文件
1)下載 cas php客戶端 http://downloads.jasig.org/cas-clients/php/current/CAS-1.3.1.tgz
2) 因爲其用到了PEAR的DB庫,須要下載
http://pear.php.net/get/PEAR-1.7.1.tgz
http://pear.php.net/get/DB-1.7.13.tgz
固然不必定是我說的版本,但我給的是我試驗成功的版本。
3) 用於使用到了SSL因此須要下載openssl。固然我是在windows環境下試驗的,下載的windows版本。
4)安裝openssl。
二、配置PHP環境
1)將CAS-1.3.1.tgz、PEAR-1.7.1.tgz、DB-1.7.13.tgz放在同一個目錄如圖。
4)因爲phpcas用到了CURL(用於鏈接ssl),所以須要保證php解釋環境須要有這個擴展。須要作的就是修改ini文件將extentions節下的屏蔽符號去掉,而後就是檢查PHP環境的extentions目錄下是否有對應的.dll。通常標準安裝都會有。
三、測試CAS的php客戶端
1)在CAS-1.3.1.tgz中的docs/examples文件夾拷貝到網站的根目錄下。
2)config.example.php 修改成config.php
3)打開config.php 進行修改
4)訪問 localhost:8080/examples/example_simple.php (客戶端的地址)
會跳轉到CAS服務器登陸頁面。默認只要用戶名和密碼相同就能夠經過驗證。
登錄成功後會中轉到客戶端。提示驗證成功。
其它客戶端的配置按以上步驟配置。便可實現單點。
進階
CAS服務端使用數據庫驗證用戶
建立表
create table t_user(
username varchar(200) primary key,
password varchar(200)
);
insertinto users(username,password) values(‘test’,’123′);
添加jar
將數據庫驅動包:mysql-connector-java-5.1.5-bin.jar cas-server-support-jdbc-3.x.x.jar(來自於\cas-server-3.4.2\modules) copy到cas/WEB-INF/lib/下
建立驗證service層
建立LoginDAO
public class LoginDAO extends JdbcDaoSupport {
public List queryList(String sql,Object[] objs){
return this.getJdbcTemplate().queryForList(sql, objs);
}
}
建立LoginService
public class LoginService {
private LoginDAO loginDAO;
/**
* 判斷用戶登陸信息
* @param username
* @param password
* @return null爲用戶不存在,false密碼錯誤,true登陸成功
*/
public Boolean isUserCorrect(String username,String password){
String sql = 「select password from t_user where username=?」;
List results = loginDAO.queryList(sql, new Object[]{username});
if(results==null||results.size()==0){
return null;
}else if(password.equals(((Map)results.get(0)).get(「password」).toString())){
return new Boolean(true);
}else{
return new Boolean(false);
}
}
public LoginDAO getLoginDAO() {
return loginDAO;
}
public void setLoginDAO(LoginDAO loginDAO) {
this.loginDAO = loginDAO;
}
}
重寫驗證類
//重寫AbstractUsernamePasswordAuthenticationHandler中驗證方法authenticateUsernamePasswordInternal
public class UserAuthenticationHandler extends
AbstractUsernamePasswordAuthenticationHandler {
private LoginService loginService;
@Override
protected boolean authenticateUsernamePasswordInternal(
UsernamePasswordCredentials credentials) throws AuthenticationException {
String username = credentials.getUsername();
String password = credentials.getPassword();
Boolean result = loginService.isUserCorrect(username, password);
if(result==null){
//用戶不存在,」error.authentication.credentials.bad.usernameorpassword.username」必須在message配置文件中定義,驗證失敗時會在登陸頁面顯示信息
throw new BadPasswordAuthenticationException(「error.authentication.credentials.bad.usernameorpassword.username」);
}else if(!result.booleanValue()){
//密碼錯誤
throw new BadPasswordAuthenticationException(「error.authentication.credentials.bad.usernameorpassword.password」);
}else{
//登陸成功
return true;
}
}
public LoginService getLoginService() {
return loginService;
}
public void setLoginService(LoginService loginService) {
this.loginService = loginService;
}
}
定義錯誤信息
在messages_zh_CN.properties中添加驗證出錯信息
error.authentication.credentials.bad.usernameorpassword.username=用戶不存在
error.authentication.credentials.bad.usernameorpassword.password=密碼錯誤
配置WEB-INF\deployerConfigContext.xml文件
<!– 在添加DataSource –>
<bean id=」dataSource」 class=」org.springframework.jdbc.datasource.DriverManagerDataSource」 >
<property name=」driverClassName」>
<value>com.mysql.jdbc.Driver</value>
</property>
<property name=」url」>
<value>jdbc:mysql://localhost:3306/test</value>
</property>
<property name=」username」>
<value>root</value>
</property>
<property name=」password」>
<value>root</value>
</property>
</bean>
<!– 注入Service和DAO –>
<bean name=」jdbcTemplate」 class=」org.springframework.jdbc.core.JdbcTemplate」>
<property name=」dataSource」 ref=」dataSource」></property>
</bean>
<bean name=」loginDAO」 class=」com.cas.dao.LoginDAO」>
<property name=」jdbcTemplate」 ref=」jdbcTemplate」></property>
</bean>
<bean name=」loginService」 class=」com.cas.service.LoginService」>
<property name=」loginDAO」 ref=」loginDAO」></property>
</bean>
<!– 找到SimpleTestUsernamePasswordAuthenticationHandler的bean,將它註釋掉,添加下面的bean –>
<bean class=」com.cas.authentication.UserAuthenticationHandler」 >
<property name=」loginService」 ref=」loginService」></property>
</bean>啓動tomcat,測試登陸.(若是是使用war在tomcat解壓的服務端,必須將上面類的編譯完的class文件,包,信息配置文件複製到WEB-INF\classes下)