22 CAS實現單點登入體驗
目 錄
0.
文件介紹
0.1 文件目的
記錄使用 CAS 實現 SSO 的過程。
0.2 文件範圍
使用 CAS 實現 SSO 的過程 。
0.3 讀者物件
任何有興趣的傢伙。
0.4 參考文獻
提示: 列出本文件的所有參考文獻(可以是非正式出版物),格式如下:
[ 識別符號] 作者,文獻名稱,出版單位(或歸屬單位),日期
大部分都是網路上查詢的資料,很多,不列舉了。
0.5 術語與縮寫解釋
縮寫、術語 |
解 釋 |
SSO |
即 Single sign on/off ,單點登入 / 退出 |
CAS |
全稱 JA-SIG Central Authentication Service ,實現 SSO 的開源專案 |
|
|
|
|
… |
|
1. 概述
1.1 背景
單點登入是必須的,實現方式頗多,這裡就說使用 CAS 的實現方式。使用 CAS 實現 SSO ,網路上說明很多,大部分都是從製作證照開始,而實際上是可以不使用 HTTPS 驗證,這樣更方便。
單點登入的原理是透過攔截 你設定的 URL ,並跳轉到 你指定的 CAS SERVER 登入頁,當你登入成功後,帶著 TICKET ,返回到 你開啟的 URL 。然後你就可以一票在手,暢通無阻。
網上有個傢伙用旅遊的套票來解釋單點登入,非常形象。當你到達一個旅遊區門口,你可以買一個套票,套票規定你可以遊覽 N 個景點,進入這些景點的時候,你不需要再買票,也就實現了單點登入。
同時,也可以借用這個比喻說明一下單點登出。當你開啟一個應用 A 時,單擊了登出按鈕,跳轉到 或者 ,系統顯示登出成功。此時, IE 視窗沒有關閉,你繼續開啟應用 A ,仍然沒有登出成功,不需要登入。這就相當於你已經在旅遊景點內,即使你把套票撕毀了,你仍然可以繼續參觀這個景點,不會把你驅逐出去。但是,你再也進不了其它的景點了。
那麼怎麼實現立即生效的登出呢?或者這種方式是否就滿足我們的需求呢?
1.2 環境
Windows XP 、 JDK1.6.03 、 Tomcat6.0.20
注意:配置好環境變數。
1.3 下載資源
伺服器端:
當前最新版本是 3.3.4 ,測試安裝的版本為 3.3.3
客戶端:
JAVA 支援單點登入
JAVA 支援單點登出
dotnet-client DOTNET 支援類
phpcas PHP 支援
注意:同時要下載原始碼,部分功能需要修改原始碼,重新做包。
2. 配置 CAS SERVER
CAS SERVER 目錄介紹。
2.1 簡單配置
把你下載 cas-server 解壓,進入 cas-server-3.3\modules ,複製 cas-server-webapp-3.3.war 到 tomcat\webapps 下,修改名稱為 cas.war ,方便使用,原來的名字太長了。然後啟動 IE ,輸入 檢驗是否可以訪問,如果可以,則輸入相同的使用者名稱和密碼,比如 cas/cas ,測試是否能登入。
如果你對安全性要求不高且急不可待,這個時候就可以直接進行 CAS CLIENT 的配置。
2.2 資料庫驗證配置
簡單配置後,可以使用相同的使用者名稱和密碼,進行登入。這個不實際,可以透過配置實現連線自己的資料庫進行配置。這裡有個前提,就是所有系統需要使用相同的使用者表和密碼加密方法,可以使用 CAS 自帶的加密方法( \org\jasig\cas\authentication\handler\ DefaultPasswordEncoder.class )或自己用 JAVA 寫的加密方法。
進入目錄 tomcat\webapps\cas\WEB-INF ,開啟檔案 deployerConfigContext.xml ,找到類似下面的程式碼:
注意 : cas-server 根據版本不同 , 檔案的路徑或 BEAN 位置可能不同 , 逐個資料夾找下。
這是預設的方法。同時還有兩種可選,如下:
/************************************************************************/
abstract="false" lazy-init="default" autowire="default" dependency-check="default">
以上兩種方式都經過測試。另外,也可以寫出自己的方法驗證,修改
BEAN
的
CLASS
屬性即可。如果沒有密碼沒有加密,則可以把引數
下面針對最下面的方法進行說明。
看它的屬性,還需要定義兩個 BEAN ,資料來源和加密,如下:
-->
<!--ORACLE à
加密 à
class="org.jasig.cas.authentication.handler.DefaultPasswordEncoder" autowire="byName">
由於 CAS-SERVER.WAR 預設沒有采用資料庫加密,所以部分 JAR 包,沒有引入,下面這些需要複製到 webapps\cas\WEB-INF\lib 裡面:
Cas-server-support-jdbc-3.3.3.jar
Cas-server-support-ldap-3.3.3.jar
Commons-dbcp.jar
Commons-pool.jar
Org.springframework.jdbc-3.0.0.M4.jar //spring 要根據自己的版本選擇
Org.springframework.transaction-3.0.0.M4.jar
Sqljdbc.jar // 資料庫連線 JAR ,根據自己的複製
Oraclejdbc.jar
完成以後,使用者表資料準備好後,可以執行 進行登入測試。這個時候很容易出現錯誤,多數是因為 JAR 包問題,注意檢視 tomcat\logs 日誌檔案,進行檢查,問題很容易解決。
2.3 引數配置
這裡只說明一下我涉及到的引數,可能有更多引數,目前還沒有用到。
1 、 tomcat\webapps\cas\WEB-INF\ deployerConfigContext.xml
p:httpClient-ref="httpClient"/>
增加引數 p:requireSecure="false" ,是否需要安全驗證,即 HTTPS , false 為不採用,加上去之後如下:
p:httpClient-ref="httpClient" p:requireSecure="false"/>
2 、 Tomcat 6.0\webapps\cas\WEB-INF\spring-configuration\
ticketGrantingTicketCookieGenerator.xml
p:cookieSecure="true"
p:cookieMaxAge="-1"
p:cookieName="CASTGC"
p:cookiePath="/cas" />
引數 p:cookieSecure="true" ,同理為 HTTPS 驗證相關, TRUE 為採用 HTTPS 驗證,與 deployerConfigContext.xml 的引數保持一致。
引數 p:cookieMaxAge="-1" ,簡單說是 COOKIE 的最大生命週期, -1 為無生命週期,即只在當前開啟的 IE 視窗有效, IE 關閉或重新開啟其它視窗,仍會要求驗證。可以根據需要修改為大於 0 的數字,比如 3600 等,意思是在 3600 秒內,開啟任意 IE 視窗,都不需要驗證。
warnCookieGenerator.xml
p:cookieSecure="true"
p:cookieMaxAge="-1"
p:cookieName="CASPRIVACY"
p:cookiePath="/cas" />
兩個引數與上面同理。
3 、 TICKET 的生命週期也可以在 web.xml 加這個引數實現:
<!-- Timeout for granting tickets -->
2.4HTTPS 驗證配置
證照的製作使用 keytool 工具,進入 CMD ,輸入 keytool ,回車測試,如果出現幫助,則說明環境變數配置正確,如果沒有,則配置 PATH ,加入 %JAVA_HOME%\BIN 。
下面開始製作,先找好存放證照的位置:
(1) keytool -genkey -alias tomcatcas -keystore tomcatcas -keyalg RSA -validity 3666
這一步是製作金鑰庫。
注意:名字與姓氏要輸入主機名或域名或 localhost ,不能隨意輸入。密碼為自己設定。下面的密碼直接回車。
( 2 ) keytool -export -alias tomcatcas -keystore tomcatcas -file tomcatcas.crt
這一步是把金鑰庫匯出為證照檔案。
注意:密碼為上一步設定的密碼。
( 3 ) keytool -import -alias tomcatcas -file tomcatcas.crt
-keystore %JAVA_HOME%/jre/lib/security/cacerts
這一步是把證照匯入 TOMCAT 。
後面的路徑為 TOMCAT 使用的 JRE 路徑, JDK1.6 安裝有兩個目錄 JDK1.6 和 JRE1.6 , TOMCAT6.0 只要 JRE1.6 即可,通常在安裝時,也都是預設到 JRE1.6 ,這時要輸入 %JRE_HOME%\lib\security\cacerts ,這個地方必須要確認準確。
注意:這裡需要輸入密碼,此密碼不是前面設定的密碼,是系統預設的密碼 changeit
( 4 )配置 tomcat6.0\conf\server.xml
<!--
maxThreads="150" scheme="https" secure="true"
clientAuth="false" sslProtocol="TLS"
/>
à
加入金鑰庫檔案和密碼(前面設定的密碼),修改為
maxThreads="150" scheme="https" secure="true"
clientAuth="false" sslProtocol="TLS"
keystoreFile="d:\data\tomcatcas.keystore"
keystorePass="123456"
/>
注意:金鑰庫檔案的要放到安全的位置,不能被隨意移動。
完成後,可重啟 TOMCAT ,進行測試。
2.5 自定義頁面
CAS 頁面檔案放在 Tomcat 6.0\webapps\cas\WEB-INF\view\jsp 中,頁面配置檔案在 Tomcat 6.0\webapps\cas\WEB-INF\classes 中,比如 default_views.properties ,在這裡指定登入用哪個頁面,登出用哪個頁面等等。
在 Tomcat 6.0\webapps\cas\WEB-INF\cas.properties 檔案指定使用哪個皮膚頁面。
下面開始操作:
1 、進入 Tomcat 6.0\webapps\cas\WEB-INF\view\jsp ,複製 default 資料夾,並改名,再複製回來,如 myth 。
2 、進入 Tomcat 6.0\webapps\cas\WEB-INF\classes ,複製 default_views.properties ,並改名再複製回來,如 myth_views.properties 。開啟檔案,把裡面的目錄 ..\jsp\default\ui 修改為自己的路徑,如 ..\jsp\myth\ui 。
3 、進入 Tomcat 6.0\webapps\cas\WEB-INF ,開啟 cas.properties 檔案,修改
cas.viewResolver.basename=myth_views
完成以上 3 步後 , 開啟 IE , 進入 進行測試 , 如果成功則進行下一步 。
注意:檔案中 logout 使用的類。
4 、修改頁面樣式
最後一點說明, Tomcat 6.0\webapps\cas\WEB-INF\cas-server.xml 中,有個 BEAN :
p:order="0">
這個不要修改 , 否則出現 http code 500 for url 。
3. 配置 JAVA CLIENT
3.1HTTPS 驗證
1 、把 casclient.jar 、 cas-client-3.1.8.jar 複製到你的 jsp 工程的 WEB-INF\lib 裡;
2 、修改 web.xml ,增加下面的程式碼:
<!-- 用於單點退出 -->
<!-- 用於單點登入 -->
下面兩個為驗證地址,即 cas server 的地址,如果使用 https 驗證,地址為 字樣 - ->
本工程的 URL ,被攔截的地址 - ->
3 、在頁面獲得驗證返回的使用者
使用者可以透過以下方式,從 JSP 或 servlet 中獲取透過認證的使用者名稱:
String username = (String)session.getAttribute(edu.yale.its.tp.cas.client.filter.CASFilter.CAS_FILTER_USER);
獲得更完整的受認證使用者資訊物件 CASReceipt Java Bean ,可以使用以下語句:
CASReceipt receipt = (CASReceipt )session.getAttribute(edu.yale.its.tp.cas.client.filter.CASFilter.CAS_FILTER_RECEIPT);
完成以上後,進行測試。出現錯誤時,請檢視 tomcat\logs 檔案解決。
3.2HTTP 驗證
1 、修改 casclient.jar 中檔案,如圖:
2 、重新做 jar 包,複製到工程目錄
完成後,做好測試。登入成功後的樣子,如下圖:
4. 配置 DOTNET CLIENT
1 、把 DotNetCasClient.cs 複製到 DotNet 專案
2 、新建 loginPage.aspx , Page_Load 加入程式碼
DotNetCASClient.DotNetCASClientServiceValidate client = new DotNetCASClient.DotNetCASClientServiceValidate();
String userId = client.Authenticate(Request, Response, false);
if (userId.Equals("failed"))
{
//Handle the auth failure...
}
else
{
Session[DotNetCASClient.SessionHandle.getUserSession()] = userId;
FormsAuthentication.RedirectFromLoginPage(userId, false);
}
注意: FormsAuthentication.RedirectFromLoginPage 這個方法。
3 、在 Default.aspx 的 Page_Load 內加入獲得使用者的程式碼:
4 、修改 web.config 檔案
完成後,執行測試,效果如下圖:
Cas 為使用者名稱。
5. 配置 PHP CLIENT
6. 如何實現單點登出
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/725190/viewspace-626592/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 使用CAS實現單點登入
- 跨域分散式系統單點登入的實現(CAS單點登入)跨域分散式
- CAS實現單點登入SSO執行原理探究
- CAS單點登入(SSO)實戰(一)
- CAS單點登入-簡介
- CAS單點登入-基礎搭建
- CAS單點登入-https配置HTTP
- Spring Security系列教程之實現CAS單點登入上篇-概述Spring
- CAS SSO單點登入框架學習框架
- CAS實現單點登入SSO執行原理探究(終於明白了)
- 長沙Java培訓系列教程之實現CAS單點登入上篇Java
- Liferay中使用CAS實現單點登陸(SSO)
- 【實踐篇】基於CAS的單點登入實踐之路
- 採用 CAS 原理構建單點登入
- CAS 單點登入流程
- 單點登入原理與簡單實現
- java實現簡單的單點登入Java
- CAS SSO單點登入服務端環境搭建服務端
- CAS SSO單點登入客戶端環境搭建客戶端
- Casdoor + OAuth 實現單點登入 SSOOAuth
- 單點登入 SSO 的實現原理
- CAS自定義登入驗證方法
- 改造CAS單點登入 --- 自定義登陸頁面(客戶端)客戶端
- CAS學習筆記二:CAS單點登入流程筆記
- 單點登入之cas整合sonar的配置方法詳解
- OAuth2實現單點登入SSOOAuth
- 單點登入的三種實現方式
- 什麼是單點登入?如何實現?
- 單點登陸原理及程式碼(CAS)
- 3.CAS SSO單點登入客戶端環境搭建客戶端
- 實戰模擬│單點登入 SSO 的實現
- 鬆哥手把手教你入門 Spring Boot + CAS 單點登入Spring Boot
- vue實現單點登入的N種方式Vue
- 記一次 SSO 單點登入實現
- MVC - 單點登入中介軟體MVC
- mmall_v2.0 Redis + Cookie 實現單點登入RedisCookie
- 單點登入原理與技術實現比較
- 談談SSO單點登入的設計實現