共同父域下的單點登錄

本文來自:高爽|Coder,原文地址:http://blog.csdn.net/ghsau/article/details/20466351,轉載請註明。
       單點登錄(Single Sign On),簡稱爲SSO,SSO不僅在企業級開發很常用,在互聯網中更是大行其道。隨便舉幾個例子,比如我們登錄新浪微博後,再訪問新浪首頁後,我們發現,已經自動登錄了;再比如我們登錄CSDN後,可以寫博客、逛論壇、下載資源等等。前者是完全跨域的單點登錄,下文會講,後者是共同父域下(www.csdn.net、blog.csdn.net、bbs.csdn.net、passport.csdn.net)的單點登錄,也就是本文的主要內容。
       單點登錄實際上是“身份認證”的整合,當我們存在多個應用時,我們希望登錄了其中的一個應用,再訪問其他應用時,會自動登錄,避免用戶重複的體力勞動。單點登錄的實現原理是比較簡單的,如下圖所示,當用戶通過瀏覽器第一次訪問應用系統1時,由於還沒有登錄,會被引導到認證系統進行登錄。下面開始單點登錄的過程:認證系統根據用戶在瀏覽器中輸入的登錄信息,進行身份認證,如果認證通過,返回給瀏覽器一個證明ticket(票);用戶再訪問其它應用系統時,會帶着ticket;應用系統接收到ticket後,會將其發送到認證系統進行合法性校驗;校驗通過後,用戶就不需要再次輸入用戶名密碼來登錄了,從而實現了單點登錄的功能

       上面描述的過程實際上是WEB-SSO。要實現SSO,首先必須要有統一的認證系統,其次每個應用系統都通過認證系統來校驗用戶,所以這需要兩方面的配合。WEB-SSO是比較好實現的,尤其是共同父域的情況下,我們可以通過瀏覽器的cookie來保存ticket。今天我用Servlet技術實現了SSO的主要功能,可以在這裏下載項目。

域名準備

       修改hosts文件,映射3個域名:

  1. 127.0.0.1 web1.ghsau.com  
  2. 127.0.0.1 web2.ghsau.com  
  3. 127.0.0.1 passport.ghsau.com  
       3個域名必須擁有共同父域(.ghsau.com),web1和web2用於訪問應用系統,passport用於訪問認證系統。

項目部署

       項目中包含的是兩個Eclipse Project,導入到Eclipse/MyEclipse後,可能需要設置下JavaEE類庫。WebSSOAuth爲認證系統,WebSSODemo爲應用系統,如果映射的域名和我設置的一樣,不需要設置,直接部署即可。如果不一樣,需要修改下兩個項目的web.xml文件。關鍵配置信息如下:
       WebSSOAuth/WEB-INF/web.xml:

  1. <servlet>  
  2.     <servlet-name>SSOAuth</servlet-name>  
  3.     <servlet-class>com.ghsau.servlet.SSOAuth</servlet-class>  
  4.     <init-param>  
  5.       <!-- ticket名稱 -->  
  6.       <param-name>cookieName</param-name>  
  7.       <param-value>SSOID</param-value>  
  8.     </init-param>  
  9.     <init-param>  
  10.       <!-- ticket作用域 -->  
  11.       <param-name>domainName</param-name>  
  12.       <param-value>.ghsau.com</param-value>  
  13.     </init-param>  
  14.     <init-param>  
  15.       <param-name>secure</param-name>  
  16.       <param-value>false</param-value>  
  17.     </init-param>  
  18.     <init-param>  
  19.       <!-- ticket內容加密密鑰,必須爲24個字符,中文算2個字符 -->  
  20.       <param-name>secretKey</param-name>  
  21.       <param-value>111111112222222233333333</param-value>  
  22.     </init-param>  
  23.     <init-param>  
  24.       <!-- 服務器中ticket的有效期,單位分鐘 -->  
  25.       <param-name>ticketTimeout</param-name>  
  26.       <param-value>10080</param-value>  
  27.     </init-param>  
  28.   </servlet>  
  29.   <servlet-mapping>  
  30.     <servlet-name>SSOAuth</servlet-name>  
  31.     <url-pattern>/SSOAuth</url-pattern>  
  32.   </servlet-mapping>  
       WebSSODemo/WEB-INF/web.xml:
  1. <filter>  
  2.     <filter-name>SSOAuth</filter-name>  
  3.     <filter-class>com.ghsau.filter.SSOAuth</filter-class>  
  4.     <init-param>  
  5.         <!-- 認證系統服務 -->  
  6.         <param-name>SSOService</param-name>  
  7.         <param-value>http://passport.ghsau.com:8080/WebSSOAuth/SSOAuth</param-value>  
  8.     </init-param>  
  9.     <init-param>  
  10.         <!-- 認證系統登錄頁面 -->  
  11.         <param-name>SSOLogin</param-name>  
  12.         <param-value>http://passport.ghsau.com:8080/WebSSOAuth/login.jsp</param-value>  
  13.     </init-param>  
  14.     <init-param>  
  15.         <!-- 認證系統ticket名稱 -->  
  16.         <param-name>cookieName</param-name>  
  17.         <param-value>SSOID</param-value>  
  18.     </init-param>  
  19.   </filter>  
  20.   <filter-mapping>  
  21.     <filter-name>SSOAuth</filter-name>  
  22.     <url-pattern>*.jsp</url-pattern>  
  23.   </filter-mapping>  
  24.   <filter-mapping>  
  25.     <filter-name>SSOAuth</filter-name>  
  26.     <url-pattern>/logout</url-pattern>  
  27.   </filter-mapping>  
       如果域名或端口號和我的不一致,可以修改對應配置項。最後部署到應用服務器中,啓動服務器。

SSO使用

       首先輸入第一個應用系統的訪問地址,http://web1.ghsau.com:8080/WebSSODemo/index.jsp,如果是第一次訪問的話,會自動跳轉到登錄頁,如下圖:

       系統中內置了3個用戶,張三、李四、王五,用戶名和密碼皆爲拼音全拼,輸入zhangsan/zhangsan登錄後,會自動跳轉到我們剛纔訪問的頁面,頁面中顯示了登錄的用戶名及歡迎信息,如下圖:

       這時,我們再輸入第二個應用系統的訪問地址,http://web2.ghsau.com:8080/WebSSODemo/index.jsp,我們發現,沒有進行第二次登錄,同樣頁面中顯示了登錄的用戶名及歡迎信息,如下圖:

       我們接着點擊Logout註銷用戶,頁面跳轉到了登錄頁面,這時我們再回頭訪問第一個應用系統的頁面,發現同樣跳轉到了登錄頁面。這給用戶的使用效果就是,一個應用登錄了,其它的應用都會自動登錄,而一個應用中註銷了,其它的應用也都會自動註銷,好神奇的樣子。
       項目中提供了源碼,代碼的實現思路就是上面的那個圖,ticket保存在cookie中,利用cookie域的特性,實現了ticket在不同應用中都能夠獲取到,ticket的驗證過程是使用了HttpClient來發送的驗證請求,ticket的加密使用了3DES,具體可以看DESUtils.java,好了,就到這裏吧,如果有什麼問題,歡迎討論。
       本文來自:高爽|Coder,原文地址:http://blog.csdn.net/ghsau/article/details/20466351,轉載請註明。
發佈了35 篇原創文章 · 獲贊 25 · 訪問量 24萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章