共同父域下的單點登錄


       本文來自:高爽|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個域名:

127.0.0.1 web1.ghsau.com
127.0.0.1 web2.ghsau.com
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:

<servlet>
<servlet-name>SSOAuth</servlet-name>
<servlet-class>com.ghsau.servlet.SSOAuth</servlet-class>
<init-param>
<!-- ticket名稱 -->
<param-name>cookieName</param-name>
<param-value>SSOID</param-value>
</init-param>
<init-param>
<!-- ticket作用域 -->
<param-name>domainName</param-name>
<param-value>.ghsau.com</param-value>
</init-param>
<init-param>
<param-name>secure</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<!-- ticket內容加密密鑰,必須為24個字符,中文算2個字符 -->
<param-name>secretKey</param-name>
<param-value>111111112222222233333333</param-value>
</init-param>
<init-param>
<!-- 服務器中ticket的有效期,單位分鍾 -->
<param-name>ticketTimeout</param-name>
<param-value>10080</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>SSOAuth</servlet-name>
<url-pattern>/SSOAuth</url-pattern>
</servlet-mapping>
       WebSSODemo/WEB-INF/web.xml:
<filter>    <filter-name>SSOAuth</filter-name>    <filter-class>com.ghsau.filter.SSOAuth</filter-class>    <init-param>        <!-- 認證系統服務 -->    	<param-name>SSOService</param-name>    	<param-value>http://passport.ghsau.com:8080/WebSSOAuth/SSOAuth</param-value>    </init-param>    <init-param>        <!-- 認證系統登錄頁面 -->    	<param-name>SSOLogin</param-name>    	<param-value>http://passport.ghsau.com:8080/WebSSOAuth/login.jsp</param-value>    </init-param>    <init-param>        <!-- 認證系統ticket名稱 -->    	<param-name>cookieName</param-name>    	<param-value>SSOID</param-value>    </init-param>  </filter>  <filter-mapping>    <filter-name>SSOAuth</filter-name>    <url-pattern>*.jsp</url-pattern>  </filter-mapping>  <filter-mapping>    <filter-name>SSOAuth</filter-name>    <url-pattern>/logout</url-pattern>  </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,轉載請注明。


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2020 ITdaan.com