1. 程式人生 > >CAS_SSO單點登入例項詳細步驟(轉)、Tomcat ssl(https) 配置

CAS_SSO單點登入例項詳細步驟(轉)、Tomcat ssl(https) 配置

    0, 從CAS官網下載最新版本的CAS伺服器:cas-server-3.5.1-release.zipjava版客戶端cas-client-3.2.1-release.zip

1, 修改hosts檔案,新增域名方便演示
127.0.0.1    cas.my.com #對應部署cas server的tomcat,這個虛擬域名還用於證書生成
127.0.0.1    app1.my.com # 對應部署app1 的tomcat
127.0.0.1    app2.my.com #對應部署app2 的tomcat

2, JDK安裝, JAVA_HOME

3, 數字證書配置 - 生成資料證書檔案(資料庫)。所有的數字證書是以一條一條(採用別名區別)的形式存入證書庫的中,證書庫中的一條證書包含該條證書的私鑰,公鑰和對應的數字證書
的資訊。
keytool -genkey -alias casdemo -keyalg RSA -keysize 1024 -storepass [email protected] -keypass [email protected] -validity 365 -keystore E:\WorkRecords\CAS\casdemo.keystore

-storepass 指定私鑰資料庫keystore的密碼(所有訪問keystore檔案的命令都要提供改密碼)
-keypass 用來保護金鑰對中的私鑰。
-keypass 和 storepass 兩個密碼要一致,否則下面tomcat 配置https 訪問會報錯誤(tomcat下配置檔案對應的屬性名叫keystorePass):java.io.IOException: Cannot recover key
可以使用下述命令修改keypass 和 storepass
keytool -alias casdemo -storepasswd -keystore E:\WorkRecords\CAS\casdemo.keystore -storepass
[email protected]
-new [email protected]
keytool -alias casdemo -keypasswd -keystore E:\WorkRecords\CAS\casdemo.keystore -storepass [email protected] -keypass [email protected] -new [email protected]
緊跟著輸入的證書名CN必須是伺服器的域名:cas.my.com

4, 數字證書配置 - 從資料證書資料庫中匯出指定的數字證書檔案,數字證書檔案只包括主體資訊和對應的公鑰
。 
keytool -export -alias casdemo -keystore E:\WorkRecords\CAS\casdemo.keystore -file E:\WorkRecords\CAS\casdemo.crt -storepass [email protected]

5,客戶端匯入 - 在客戶端匯入數字證書(包含主體資訊和對應的公鑰)
keytool -import -keystore %JAVA_HOME%\jre\lib\security\cacerts -file E:\WorkRecords\CAS\casdemo.crt

注意:cacerts是certified authority certificates的縮寫,就是java存放證書的證書庫。訪問這個檔案的預設密碼是changeit,要把證書匯入到這裡時,系統會提示你輸入該密碼。可以通過下面的命令把cacerts的訪問密碼改成[email protected]
keytool -storepasswd -alias casdemo -keystore %JAVA_HOME%\jre\lib\security\cacerts -storepass changeit -new [email protected]

6,tomcat容器啟用https訪問
修改conf/server.xml配置檔案,啟用8443埠配置,並增加屬性keystoreFile="E:\WorkRecords\CAS\casdemo.keystore" keystorePass="[email protected]" URIEncoding="UTF-8"
然後重啟tomcat
https://localhost:8443/cas-server-webapp-3.5.1/login

keystoreFile 就是建立的私鑰證書的路徑
keystorePass 就是建立的私鑰證書的訪問密碼

7,部署CAS-Server相關的Tomcat,參考CAS-Server下載目錄下的INSTALL.txt安裝
把cas-server-3.5.1\modules\cas-server-webapp-3.5.1.war複製到tomcat webapps目錄下,然後重啟tomcat,用下面路徑訪問CAS伺服器
https://localhost:8443/cas-server-webapp-3.5.1/login
預設的cas server的驗證是隻要使用者名稱和密碼一樣就可以成功登入。(僅僅用於測試,生成環境需要根據實際情況修改)

8,部署CAS-Client相關的Tomcat:參考Configuring the Jasig CAS Client for Java in the web.xml
把cas-client-3.2.1/modules/cas-client-core-3.2.1.jar複製到你所釋出的webapp的WEB-INF/lib下(測試時可以使用tomcat下的example做例子),在客戶端web應用中修改WEB-INF/web.xml 在裡面新增如下過濾器
Java程式碼 複製程式碼 收藏程式碼
  1. <!-- 用於單點退出 -->  
  2. <listener>  
  3.     <listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class>  
  4. </listener>  
  5. <filter>  
  6.     <filter-name>CAS Single Sign Out Filter</filter-name>  
  7.     <filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class>  
  8. </filter>  
  9. <!-- 用於單點登入 -->  
  10. <filter>  
  11.     <filter-name>CASFilter</filter-name>  
  12.     <filter-class>edu.yale.its.tp.cas.client.filter.CASFilter</filter-class>  
  13.     <init-param>  
  14.         <param-name>edu.yale.its.tp.cas.client.filter.loginUrl</param-name>  
  15.         <param-value>https://cas.my.com:8443/cas/login</param-value>
  16.         <!--這裡的server是服務端的IP-->  
  17.     </init-param>  
  18.     <init-param>  
  19.         <param-name>edu.yale.its.tp.cas.client.filter.validateUrl</param-name>  
  20.         <param-value>https://cas.my.com:8443/cas/proxyValidate</param-value>
  21.         <!--這裡的ServerName是服務端的主機名也就是CN-->  
  22.     </init-param>  
  23.     <init-param>  
  24.         <param-name>edu.yale.its.tp.cas.client.filter.serverName</param-name>  
  25.         <param-value>localhost:8080</param-value>  
  26.         <!--client:port就是需要cas需要攔截的地址和埠,一般就是這個tomcat所啟動的ip和port-->  
  27.     </init-param>  
  28. </filter>  
  29. <filter-mapping>  
  30.     <filter-name>CAS Single Sign Out Filter</filter-name>  
  31.     <url-pattern>/*</url-pattern>  
  32. </filter-mapping>  
  33. <filter-mapping>  
  34.     <filter-name>CASFilter</filter-name>  
  35.     <url-pattern>/*</url-pattern>  
  36. </filter-mapping>  
  37. <!-- 該過濾器負責實現HttpServletRequest請求的包裹,  
  38.     比如允許開發者通過HttpServletRequest的getRemoteUser()方法獲得SSO登入使用者的登入名,可選配置。  
  39. -->  
  40. <filter>  
  41.     <filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>  
  42.     <filter-class>  
  43.                     org.jasig.cas.client.util.HttpServletRequestWrapperFilter</filter-class>  
  44. </filter>  
  45. <filter-mapping>  
  46.     <filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>  
  47.     <url-pattern>/*</url-pattern>  
  48. </filter-mapping>  
  49. <!-- 該過濾器使得開發者可以通過org.jasig.cas.client.util.AssertionHolder來獲取使用者的登入名。  
  50.     比如AssertionHolder.getAssertion().getPrincipal().getName()。  
  51. -->  
  52. <filter>  
  53.     <filter-name>CAS Assertion Thread Local Filter</filter-name>  
  54.     <filter-class>org.jasig.cas.client.util.AssertionThreadLocalFilter</filter-class>  
  55. </filter>  
  56. <filter-mapping>  
  57.     <filter-name>CAS Assertion Thread Local Filter</filter-name>  
  58.     <url-pattern>/*</url-pattern>  
  59. </filter-mapping>  
	<!-- 用於單點退出 -->
	<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>
		<filter-name>CASFilter</filter-name>
		<filter-class>edu.yale.its.tp.cas.client.filter.CASFilter</filter-class>
		<init-param>
			<param-name>edu.yale.its.tp.cas.client.filter.loginUrl</param-name>
			<param-value>https://cas.my.com:8443/cas/login</param-value>
			<!--這裡的server是服務端的IP-->
		</init-param>
		<init-param>
			<param-name>edu.yale.its.tp.cas.client.filter.validateUrl</param-name>
			<param-value>https://cas.my.com:8443/cas/proxyValidate</param-value>
			<!--這裡的ServerName是服務端的主機名也就是CN-->
		</init-param>
		<init-param>
			<param-name>edu.yale.its.tp.cas.client.filter.serverName</param-name>
			<param-value>localhost:8080</param-value>
			<!--client:port就是需要cas需要攔截的地址和埠,一般就是這個tomcat所啟動的ip和port-->
		</init-param>
	</filter>
	<filter-mapping>
		<filter-name>CAS Single Sign Out Filter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>
	<filter-mapping>
		<filter-name>CASFilter</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>

藉以tomcat預設自帶的 webapps\examples 作為演示的簡單web專案,訪問url:http://localhost:8080/examples/servlets/
9, 獲取登入使用者的資訊
Java程式碼 複製程式碼 收藏程式碼
  1. import java.io.*;  
  2. import java.util.*;  
  3. import java.util.Map.Entry;  
  4. import javax.servlet.*;  
  5. import javax.servlet.http.*;  
  6. import org.jasig.cas.client.authentication.AttributePrincipal;  
  7. import org.jasig.cas.client.util.AbstractCasFilter;  
  8.     import org.jasig.cas.client.validation.Assertion;  
  9.     /** 
  10.      * The simplest possible servlet. 
  11.      * 
  12.      * @author James Duncan Davidson 
  13.      */
  14.     publicclass HelloWorldExample extends HttpServlet {  
  15.         publicvoid doGet(HttpServletRequest request, HttpServletResponse response)  
  16.                 throws IOException, ServletException {  
  17.             ResourceBundle rb = ResourceBundle.getBundle("LocalStrings", request  
  18.                     .getLocale());  
  19.             response.setContentType("text/html");  
  20.             PrintWriter out = response.getWriter();  
  21.             out.println("<html>");  
  22.             out.println("<head>");  
  23.             String title = rb.getString("helloworld.title");  
  24.             out.println("<title>" + title + "</title>");  
  25.             out.println("</head>");  
  26.             out.println("<body bgcolor=\"white\">");  
  27.             out.println("<a href=\"../helloworld.html\">");  
  28.             out.println("<img src=\"../images/code.gif\" height=24 "
  29.                     + "width=24 align=right border=0 alt=\"view code\"></a>");  
  30.             out.println("<a href=\"../index.html\">");  
  31.             out.println("<img src=\"../images/return.gif\" height=24 "
  32.                     + "width=24 align=right border=0 alt=\"return\"></a>");  
  33.             out.println("<h1>" + title + "</h1>");  
  34.             Assertion assertion = (Assertion) request.getSession().getAttribute(  
  35.                     AbstractCasFilter.CONST_CAS_ASSERTION);  
  36.             if (null != assertion) {  
  37.                 out.println(" Log | ValidFromDate =:"
  38.                         + assertion.getValidFromDate() + "<br>");  
  39.                 out.println(" Log | ValidUntilDate =:"
  40.                         + assertion.getValidUntilDate() + "<br>");  
  41.                 Map<Object, Object> attMap = assertion.getAttributes();  
  42.                 out.println(" Log | getAttributes Map size = " + attMap.size()  
  43.                         + "<br>");  
  44.                 for (Entry<Object, Object> entry : attMap.entrySet()) {  
  45.                     out.println("     | " + entry.getKey() + "=:"
  46.                             + entry.getValue() + "<br>");  
  47.                 }  
  48.             }  
  49.             AttributePrincipal principal = assertion.getPrincipal();  
  50.             // AttributePrincipal principal = (AttributePrincipal) request
  51.             // .getUserPrincipal();
  52.             String username = null;  
  53.             out.print(" Log | UserName:");  
  54.             if (null != principal) {  
  55.                 username = principal.getName();  
  56.                 out.println("<span style='color:red;'>" + username + "</span><br>");  
  57.             }  
  58.             out.println("</body>");  
  59.             out.println("</html>");  
  60.         }  
	import java.io.*;
	import java.util.*;
	import java.util.Map.Entry;
	 
	import javax.servlet.*;
	import javax.servlet.http.*;
	 
	import org.jasig.cas.client.authentication.AttributePrincipal;
	import org.jasig.cas.client.util.AbstractCasFilter;
 	import org.jasig.cas.client.validation.Assertion;
 	 
 	/**
 	 * The simplest possible servlet.
 	 *
 	 * @author James Duncan Davidson
 	 */
 	 
 	public class HelloWorldExample extends HttpServlet {
 	 
 	    public void doGet(HttpServletRequest request, HttpServletResponse response)
 	            throws IOException, ServletException {
 	        ResourceBundle rb = ResourceBundle.getBundle("LocalStrings", request
 	                .getLocale());
 	        response.setContentType("text/html");
 	        PrintWriter out = response.getWriter();
 	 
 	        out.println("<html>");
 	        out.println("<head>");
 	 
 	        String title = rb.getString("helloworld.title");
 	 
 	        out.println("<title>" + title + "</title>");
 	        out.println("</head>");
 	        out.println("<body bgcolor=\"white\">");
 	 
 	        out.println("<a href=\"../helloworld.html\">");
 	        out.println("<img src=\"../images/code.gif\" height=24 "
 	                + "width=24 align=right border=0 alt=\"view code\"></a>");
 	        out.println("<a href=\"../index.html\">");
 	        out.println("<img src=\"../images/return.gif\" height=24 "
 	                + "width=24 align=right border=0 alt=\"return\"></a>");
 	        out.println("<h1>" + title + "</h1>");
 	 
 	        Assertion assertion = (Assertion) request.getSession().getAttribute(
 	                AbstractCasFilter.CONST_CAS_ASSERTION);
 	 
 	        if (null != assertion) {
 	            out.println(" Log | ValidFromDate =:"
 	                    + assertion.getValidFromDate() + "<br>");
 	            out.println(" Log | ValidUntilDate =:"
 	                    + assertion.getValidUntilDate() + "<br>");
 	            Map<Object, Object> attMap = assertion.getAttributes();
 	            out.println(" Log | getAttributes Map size = " + attMap.size()
 	                    + "<br>");
 	            for (Entry<Object, Object> entry : attMap.entrySet()) {
 	                out.println("     | " + entry.getKey() + "=:"
 	                        + entry.getValue() + "<br>");
 	            }
 	 
 	        }
 	        AttributePrincipal principal = assertion.getPrincipal();
 	 
 	        // AttributePrincipal principal = (AttributePrincipal) request
 	        // .getUserPrincipal();
 	 
 	        String username = null;
 	        out.print(" Log | UserName:");
 	        if (null != principal) {
 	            username = principal.getName();
 	            out.println("<span style='color:red;'>" + username + "</span><br>");
 	        }
 	 
 	        out.println("</body>");
 	        out.println("</html>");
 	    }


keytool報錯誤:keytool error: java.security.UnrecoverableKeyException: Cannot recover key
表明:命令中輸入的keyPass不正確

參考:
CAS官網地址:http://www.jasig.org/cas
CAS幫助文件:https://wiki.jasig.org/display/CASUM/Home
keytool - Key and Certificate Management Tool: 管理私鑰資料庫(keystore)以及私鑰關聯的X.509證書鏈驗證的對應公鑰(證書),同時也為受信實體管理證書。
keytool工具的詳細運用
CAS_SSO單點登入例項詳細步驟
SSO之CAS單點登入例項演示  

相關推薦

CAS_SSO登入例項詳細步驟()Tomcat ssl(https) 配置

    0, 從CAS官網下載最新版本的CAS伺服器:cas-server-3.5.1-release.zip和java版客戶端cas-client-3.2.1-release.zip。 1, 修改hosts檔案,新增域名方便演示 127.0.0.1    cas.my.com #對應部署cas serv

SSO CAS登入搭建詳細步驟及原始碼

1.因為是本地模擬sso環境,而sso的環境測試需要域名,所以需要虛擬幾個域名出來,步驟如下: 2.進入目錄C:\Windows\System32\drivers\etc 3.修改hosts檔案 127.0.0.1  jeesz.cn 127.0.0.1  sso1.

SSO之CAS登入例項演示

本文目錄: 一、概述 二、演示環境 三、JDK安裝配置 四、安全證書配置 五、部署CAS-Server相關的Tomcat 六、部署CAS-Client相關的Tomcat 七、 測試驗證SSO 一、概述 此文的目的就是為了幫助初步接觸S

CAS登入-客戶端整合(shirospringbootjwtpac4j)(十)

CAS單點登入-客戶端整合(shiro springboot jwt pac4j)(十) 由於我們通常在業務上會有以下的使用場景: 移動端通過業務系統鑑權 移動端免登入(登入一次以後) 解決方案: JWT(token認證方案) OAuth(第三方認

SSO CAS登入框架學習 搭建詳細步驟及原始碼

1.瞭解單點登入  SSO 主要特點是: SSO 應用之間使用 Web 協議(如 HTTPS) ,並且只有一個登入入口. SSO 的體系中有下面三種角色: 1) User(多個) 2) Web 應用(多個) 3) SSO 認證中心(一個)  2.SSO 實現包

SSO之CAS登錄詳細搭建教程()

接下來 .cn tle .bat then ati qq群 code mic 本教程是我個人編寫,花費幾個小時的時間,給需要學習的人員學習使用,希望能幫助到你們。 https://www.cnblogs.com/zhoubang521/p/5200407.html

自學生-天賜yuan,php登入實現demo

1.準備兩個虛擬域名 127.0.0.1  www.openpoor.com 127.0.0.1  www.myspace.com 2.在openpoor的根目錄下建立以下檔案 index.php [php]&n

Atitit 登入實現幾種模式架構圖 目錄 1. 因此要點也就以下兩個:儲存信任驗證信任 1 1.1. 共享cookie (最簡單 1 1.2. 通過 url帶token引數跳 1 1.3.

Atitit 單點登入實現幾種模式架構圖   目錄 1. 因此要點也就以下兩個:儲存信任驗證信任 1 1.1. 共享cookie (最簡單 1 1.2. 通過 url帶token引數跳轉 1 1.3. 頁面重定向(複雜 1 1.3.1. 父子應用重定向 2

關於登入的一些資料(

單點登入(SSO——Single Sign On)對於我們來說已經不陌生了。對於大型系統來說使用單點登入可以減少使用者很多的麻煩。就拿百度來說吧,百度下面有很多的子系統——百度經驗、百度知道、百度文庫等等,如果我們使用這些系統的時候,每一個系統都需要我們輸入使用者名稱

登入原理與簡單實現(登入原理與簡單實現

單點登入原理與簡單實現   (2017-09-22更新)GitHub:https://github.com/sheefee/simple-sso 一、單系統登入機制 1、http無狀態協議   web應用採用browser/server架構,http作為通訊

SSO之CAS登入詳細搭建教程

<!-- 用於單點退出,該過濾器用於實現單點登出功能,可選配置--> <listener> <listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener

[] (圖譜) shiro登入

title: 思維導圖-【Shiro-流程】java安全框架&cas單點登入 date: 2015-10-25 9:00:00 #發表日期,一般不改動 categories: 思維導圖 #文章文類 tags: [思維導圖,【Shiro-流程】java安全框架&

手把手教你如何玩登入(SSO)

情景引入 小白:起床起床起床。。。。。。快起床 我:怎麼怎麼了。。。又怎麼了? 小白:最近,我發現了一個奇怪的事情~! 我:說收,什麼奇怪的事情了呢? 小白:我前些天,我逛了逛新浪部落格,然後看了看裡面的內容,感覺還挺不錯的。可是,關鍵讓我覺得不可思議

如何通過session控制登入----

上面已經提到了,需要通過控制session,對web服務中所有session進行遍歷操作,那麼你肯定會想到application這個大物件了(當然你也可以採用快取或者資料庫),具體實現方法是這樣的,首先在application中建立一個List<HttpSession>,用來儲存每一次會話(ses

shiro 登入原理 例項

Shiro 1.2開始提供了Jasig CAS單點登入的支援,單點登入主要用於多系統整合,即在多個系統中,使用者只需要到一箇中央伺服器登入一次即可訪問這些系統中的任何一個,無須多次登入。 Jasig CAS單點登入系統分為伺服器端和客戶端,伺服器端提供單點登入,多個客戶端

SSO登入系列5:cas登入增加驗證碼功能完整步驟

本篇教程cas-server端下載地址:解壓後,直接放到tomcat的webapp目錄下就能用了,不過你需要登入的話,要修改資料來源,C:\tomcat7\webapps\casServer\WEB-INF\deployerConfigContext.xml,嗯。地址

web sso 登入簡單例項原始碼

首先,單點登入主要目的為多個系統共用同一個身份驗證系統,即:使用者登入A系統,也可以訪問共用同一驗證系統的B系統。 廢話不多說,看例項: 採用三個web專案,實現單點登入。 專案一:SSOAuth servlet類:AuthServlet package org.s

SSO登入基本概念實現思路以及小的例項詳解

一、什麼是單點登入SSO(Single Sign-On)   SSO是一種統一認證和授權機制,指訪問同一伺服器不同應用中的受保護資源的同一使用者,只需要登入一次,即通過一個應用中的安全驗證後,再訪問其他應用中的受保護資源時,不再需要重新登入驗證。 二、單點登

總結一下我做的登入步驟

以前做的一個簡單的單點登入,就是那種這面上線,另一面就直接踢下線的那種單點登入,不是一次登入各個系統都能用的那個單點哦 流程大概就是     先進行登入操作,然後把使用者生成的session儲存到一個map集合中,key只要你能找到一個唯一的用什麼隨便,value是sess

SSO登入跨域重定向跨域設定Cookie京東單登入例項分析

最近在研究SSO單點登入技術,其中有一種就是通過js的跨域設定cookie來達到單點登入目的的,下面就已京東商城為例來解釋下跨域設定cookie的過程 涉及的關鍵知識點: 1、jquery ajax跨域重定向,要理ajax解跨域重定向,先要了解瀏覽器對重定向的處理。正常我們