共同父域下的單點登陸

版權聲明:本文爲博主原創文章,轉載請註明出處http://blog.csdn.net/ghsau。html

       本文來自:高爽|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後,會將其發送到認證系統進行合法性校驗;校驗經過後,用戶就不須要再次輸入用戶名密碼來登陸了,從而實現了單點登陸的功能。java

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

域名準備跨域

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

[html] view plain copy服務器

 print?在CODE上查看代碼片派生到個人代碼片cookie

  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用於訪問認證系統。app

 

項目部署dom

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

[html] view plain copy

 print?在CODE上查看代碼片派生到個人代碼片

  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:[html] view plain copy

 print?在CODE上查看代碼片派生到個人代碼片

  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個用戶,張3、李4、王五,用戶名和密碼皆爲拼音全拼,輸入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,轉載請註明。

相關文章
相關標籤/搜索