Liferay開源門戶系統之cas單點登錄功能集成方法

目錄

Liferay開源門戶系統之cas單點登錄功能集成方法

一、概述

二、cas服務端配置

步驟1:準備好以下運行環境

步驟2:安裝部署cas-server

步驟3:生成數字證書

步驟4:配製tomcat支持https協議

步驟5:測試

三、liferay支持cas的配置方法

四、其它web應用支持cas的配置方法

一、概述

       liferayjava中的一個開源門戶系統,它實現了jsr268規範,基於java標準的portlet組件開發而成,是java界最流行的開源門戶系統。

       liferay已經提供了單點登錄、權限控制、用戶管理、頁面佈局等功能的支持,我們只需要做相應的定製,即可實現我們的需求。

       liferay支持cas單點登錄功能比較簡單,只需要進入liferay的後臺管理頁面,填寫cas服務端信息即可,難點就在cas服務端的部署與配置。因爲cas服務端也是一個獨立的web應用,且它與cas客戶端的通信都是使用https協議,這就要求cas服務端需要提供一個非對稱加密的數字證書,私鑰導入到服務端的jre證書庫,公鑰導入到客戶端的jre證書庫中,這樣才能安全的實現的單點登錄功能。

       獲取數字證書有兩種方式:一種是手動生成;一種是付費購買。

       手動生成的數字證書是免費的,沒有公信力,會被瀏覽器攔截並不推薦使用。

       付費購買的數字證書具有公信力,瀏覽器不會攔截,但要收費。

       爲了便於測試,我將使用java提供的keytool生成數字證書。

二、cas服務端配置

步驟1:準備好運行環境

步驟2:安裝部署cas-server

步驟3:生成數字證書

步驟4:配製tomcat支持https協議

步驟5:測試

步驟1:準備好以下運行環境

jdk1.6+

tomcat6+

jdktomcat的下載、安裝、配置在此略過。

步驟2:安裝部署cas-server

       到官網(http://downloads.jasig.org/cas/cas-server-3.5.0-release.zip)下載cas-server-3.5.0-release.zip解壓縮以後,在其路徑 cas-server-3.5.0\modules 下面找到 cas-server-webapp-3.5.0.war 將其拷貝到 tomcat webapps 下, 改名爲 cas.war, 並修改 war 包中配置文件 cas.properties 裏的 cas server name=cas 並啓動 tomcat 啓動後可在瀏覽器訪問 http://localhost:8080/cas/login

當出現如下界面時,說明 cas 服務器已經初步部署成功。
CAS 服務器登錄界面

       此時,還不能作爲有效的單點登錄服務器。在實際使用的時候,還需要根據實際概況做擴展和定製,最主要的是擴展認證 (Authentication) 接口和 cas-server的界面(這部分內容以後再詳述)。其中紅色部分提示當前登錄的 cas 鏈接是不安全的,建議使用 https 協議。 

步驟3:生成數字證書

打開cmd,進入jdkbin目錄,執行以下命令

生成證書

keytool -genkey -alias ssodemo -keyalg RSA -keysize 1024 -keypass 888888 -validity 365 -keystore e:\ssodemo.keystore -storepass 888888

注意:keypassstorepass密碼要一致。

執行命令後,會讓你填寫一些基本信息,根據提示填寫就行了,唯獨“名稱”一定要填寫你的web訪問域名,例如:localhostbaidu.com,否則使用會出錯。

 

導出證書(證書導出後要給服務端與客戶端使用)

keytool -export -alias ssodemo -keystore e:\ssodemo.keystore -file e:\ssodemo.crt -storepass 888888

 

導入證書(將證書導入到cas服務端使用的jre證書庫,稍後cas客戶端也要做此操作)

keytool -import -keystore %JAVA_HOME%\jre\lib\security\cacerts -file e:\ssodemo.crt -alias ssodemo

注意:jdk的證書庫路徑在安裝目錄下的\jre\lib\security\cacerts

       cas做爲一個統一的單點登錄平臺,分爲服務端和客戶端。服務端就是剛剛部署好的cas-server,客戶端則是一個jar包:cas-client-core-3.2.1.jar,此jar包封裝了與cas服務端通信的全部過程。因此,要想讓你的web應用接入cas統一登錄平臺,需要將cas-client-core-3.2.1.jar引入你的web應用,並做相應配置。liferay已經引入此jar包,無需我們手工再引入。通常我們將要接入cas單點登錄的web應用,直稱爲“cas客戶端”,因爲相對於cas服務端來說,接入的都是客戶端。

cas-client-core-3.2.1.jar下載地址:

http://downloads.jasig.org/cas-clients/cas-client-3.2.1-release.zip

步驟4:配製tomcat支持https協議

打開tomcatserver.xml,加入以下配置,開啓https協議:

<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"

               maxThreads="150" scheme="https" secure="true"

               keystoreFile="e:/ssodemo.keystore" keystorePass="888888"

               clientAuth="false" sslProtocol="TLS" URIEncoding="UTF-8"/>

參數說明:

keystoreFile 就是步驟3中創建證書的路徑

keystorePass 就是步驟3中創建證書的密碼

步驟5:測試

重啓tomcat,訪問https://localhost:8443/cas/login,出現如下頁面則代表配置正確。

       此處由於使用手動生成的數字證書,不具有公信力,被瀏覽器攔截,我們忽略它,點擊“繼續瀏覽此網站(不推薦)”,就可以正常使用了。正式使用時,推薦購買一個付費的證書,則不會出現此畫面。

點擊“繼續瀏覽此網站(不推薦)”出現如下登錄界面:

       cas-server的默認驗證規則:只要用戶名和密碼相同就認證通過(僅僅用於測試,生成環境需要根據實際情況修改),輸入admin/admin 點擊登錄,就可以看到登錄成功的頁面:

看到上述頁面表示CAS服務端已經完全部署成功。

三、liferay支持cas的配置方法

liferay支持cas的配置方法相當簡單,先將之前生成的證書ssodemo.crt導入到liferay使用的jre證書庫中,導入方法與前述類似。然後啓動liferay,進入控制面板->portal設置->認證->一般,用戶如何認證,選擇“按屏幕名稱”。

選擇cas,進行如下設置:

設置完畢後,點擊“測試CAS配置”,出現如下圖,則代表配置成功。

好啦!現在註銷liferay用戶,重新點登錄,此時liferay跳到cas的統一登錄平臺,輸入admin/admin,登錄成功後,又跳回了liferay首頁。

四、其它web應用支持cas的配置方法

       其它web應用支持cas的配置方法,就更加簡單了。還是先將之前生成的證書ssodemo.crt導入到web應用使用的jre證書庫中,導入方法與前述類似。再將cas-client-core-3.2.1.jar引入到web應用中,並在web.xml中加入以下配置即可。

<!-- ======================== 單點登錄開始 ======================== -->

<!-- 用於單點退出,該過濾器用於實現單點登出功能,可選配置-->

<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-mapping>

         <filter-name>CAS Single Sign Out Filter</filter-name>

         <url-pattern>/*</url-pattern>

</filter-mapping>

<filter>

         <filter-name>CAS Filter</filter-name>

         <filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class>

         <init-param>

                   <param-name>casServerLoginUrl</param-name>

                   <param-value>https://localhost:8443/cas/login</param-value>

         </init-param>

         <init-param>

                   <param-name>serverName</param-name>

                   <param-value>http://localhost:18080</param-value>

         </init-param>

</filter>

<filter-mapping>

         <filter-name>CAS Filter</filter-name>

         <url-pattern>/*</url-pattern>

</filter-mapping>

<!-- 該過濾器負責對Ticket的校驗工作,必須啓用它 -->

<filter>

         <filter-name>CAS Validation Filter</filter-name>

         <filter-class>

                   org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter

         </filter-class>

         <init-param>

                   <param-name>casServerUrlPrefix</param-name>

                   <param-value>https://localhost:8443/cas</param-value>

         </init-param>

         <init-param>

                   <param-name>serverName</param-name>

                   <param-value> http://localhost:18080</param-value>

         </init-param>

</filter>

<filter-mapping>

         <filter-name>CAS Validation Filter</filter-name>

         <url-pattern>/*</url-pattern>

</filter-mapping>

<!--

         該過濾器負責實現HttpServletRequest請求的包裹,

         比如允許開發者通過HttpServletRequestgetRemoteUser()方法獲得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>

</filter>

<!--

該過濾器使得開發者可以通過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>

<!-- ======================== 單點登錄結束 ======================== -->

參數:serverName是本web應用的訪問域名


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章