轉載:http://www.ibm.com/developerworks/cn/opensource/os-cn-liferay-cas/index.htmlhtml
Liferay 是一個基於 J2EE 架構的完整的門戶解決方案,使用了 EJB、JMS 等技術, 前臺界面使用了 Struts MVC 框架、模板技術等一些開源的主流技術,基於 XML 的 portlet 配置文件能夠自由地動態擴展, 使用了 Web Services 來支持一些遠程信息的獲取,使用 Lucene 實現全文檢索功能。java
主要特色:mysql
採用最早進的技術 Java, EJB, JMS, SOAP, XML。web
提供多種單點登錄接口,如 CAS,LDAP, OpenID,OpenSSO 等。算法
管理員能經過用戶界面輕鬆管理用戶,組,角色,併爲不一樣的用戶分配不一樣的權限範圍和相應的功能。spring
用戶能夠根據須要定製個性化的頁面佈局和顏色風格。sql
能夠在主流的 J2EE 應用服務器上運行,如 Tomcat,Weblogic,WebSphere 等商業或開源免費的服務器。數據庫
支持多種主流的數據庫,如 Oracle,DB2, MySQL 等。後端
使用了第三方的開源項目,如 Velocity ,Hibernate, Lucene, Struts 等。瀏覽器
支持包括中文在內的多種語言。
目前最新的版本爲 Liferay 6.1(2012 年 2 月更新)。
CAS 是一個獨立的 web 應用 , 當前使用 Java Servlets 實現,經過 HTTPS 協議保證其數據的傳輸安全性。 它經過三個 Url 地址進行訪問:登陸 Url、驗證 URL、註銷 URL。
本文中,咱們以 Liferay6.1 的版本進行部署示例。
準備:
因爲本文須要將 Liferay 的數據庫做爲單點登陸的認證數據庫,因此須要將 Liferay 的數據庫安裝到 Mysql 上。 Mysql 的下載和安裝本文不作綴述。在此只簡要介紹 Liferay 的安裝和配置。Liferay 能夠從官方網站下載到安裝包的最新版本。
Liferay 安裝包的下載地址:
http://sourceforge.net/projects/lportal/files/Liferay%20Portal/6.1.0%20GA1/liferay-portal-tomcat-6.1.0-ce-ga1-20120106155615760.zip/download
安裝 Liferay:
Liferay 在啓動時會對數據庫進行初始化。
將下載到的安裝包 liferay-portal-tomcat-6.1.0-ce-ga1-20120106155615760.zip 解壓到安裝目錄下, 在路徑 liferay-portal-6.1.0-ce-ga1\tomcat-7.0.23\bin 下找到 startup.bat 啓動文件,並執行。在默認狀況下, liferay 會使用 Hypersonic 做爲默認數據庫,在第一次訪問時,咱們能夠對數據庫、管理用戶等參數進行配置。 當 tomcat 服務器啓動後,咱們能夠訪問 http://localhost:8080/ 若是出現基本配置頁面,則說明部署成功。 接下來,咱們能夠在這個配置頁面上對 Liferay 進行一些基本設置。首先咱們要作的是將默認的數據庫更改成咱們要使用的 Mysql 數據庫。 點擊(更改)如圖 2:
在此咱們將數據庫的連接 URL 修改成咱們新建的數據庫地址。完成後點擊完成配置。 此時 Liferay 將根據新的配置參數和數據庫地址對數據庫進行初始化。當出現以下界面時,則 Liferay 安裝完成:
準備:
下載最新版的 CAS 產品包,下載地址:
http://downloads.jasig.org/cas/cas-server-3.5.0-release.zip
安裝 CAS:
解壓縮之後,在其路徑 cas-server-3.5.0\modules 下面找到 cas-server-webapp-3.5.0.war, 將其拷貝到 liferay 的服務器部署目錄 liferay-portal-6.1.0-ce-ga1\tomcat-7.0.23\webapps 下, 更名爲 cas.war, 並修改 war 包中配置文件 cas.properties 裏的 cas server name=cas 並啓動 liferay 服務器, 啓動後可在瀏覽器訪問 http://localhost:8080/cas/login
當出現以下界面時,說明 cas 服務器已經部署成功。如圖 4:
此時,CAS 還不能做爲有效的單點登陸服務器。在實際使用的時候,還須要根據實際概況作擴展和定製,最主要的是擴展認證 (Authentication) 接口和 CAS Server 的界面。其中紅色部分的提示當前登陸的 CAS 連接是不安全的,建議使用 https 協議。 因爲 https 協議在服務器上配置已經有不少對應的文檔和幫助,在此將不作贅述,本文中,咱們將使用 http 協議對 CAS server 進行配置。
取消 CAS 服務器 HTTPS 認證方式 :
修改 cas\WEB-INF\spring-configuration\ticketGrantingTicketCookieGenerator.xml 配置文件,將 p:cookieSecure="true」 改成 p:cookieSecure="false" ,改完後以下:
<bean id="ticketGrantingTicketCookieGenerator" class="org.jasig.cas.web.support.CookieRetrievingCookieGenerator" p:cookieSecure="false" p:cookieMaxAge="-1" p:cookieName="CASTGC" p:cookiePath="/cas" />
修改 cas\WEB-INF\spring-configuration\warnCookieGenerator.xml 配置文件,將 p:cookieSecure="true」 改成 p:cookieSecure="false" ,改完後以下:
<bean id="warnCookieGenerator" class="org.jasig.cas.web.support.CookieRetrievingCookieGenerator" p:cookieSecure="false" p:cookieMaxAge="-1" p:cookieName="CASPRIVACY" p:cookiePath="/cas" />
修改 deployerConfigContext.xml: 找到"HttpBasedServiceCredentialsAuthenticationHandler" bean 添加:p:requireSecure="false", 改完後以下:
<bean class="org.jasig.cas.authentication.handler.support. HttpBasedServiceCredentialsAuthenticationHandler" p:httpClient-ref="httpClient" p:requireSecure="false"/>
這樣,在 cas 服務器運行的時候,就能夠只使用 http 請求了,省去了 HTTPS 協議的麻煩配置。
CAS 做爲單點登陸的認證服務器,在收到頁面傳遞的登陸請求之後,將請求轉發到 CAS 服務器後端進行驗證,在未經配置的時候, 只要輸入的密碼和用戶名稱一致,則驗證經過。在實際的使用中固然這樣是不可行的。在此咱們要對用戶輸入的用戶名稱和密碼作校驗。 若是存在該用戶,而且密碼正確則說明驗證經過。
這裏就有了兩個問題:第一,CAS 須要鏈接到存儲用戶信息的數據庫才能讀取到用戶信息。 第二,驗證密碼的加密算法必須和數據庫存儲密碼的加密方式一致。基於此文采用的方式,對於第一個問題, 咱們將直接使用 CAS 服務器鏈接到 Liferay 安裝的數據庫,直接讀取 Liferay 門戶的用戶信息。 對於第二個問題,咱們將直接調用 Liferay 中的加密算法對用戶輸入的密碼進行加密,而後與數據庫中的加密密碼進行比對。 這樣就能夠保證 CAS 服務器在進行用戶認證時,能夠和 Liferay 服務器使用的用戶保持一致。
咱們要讀取 Liferay 中的認證用戶信息,就須要用 CAS 連接到 Liferay 的數據庫。CAS 提供了經過 JDBC 鏈接數據庫進行驗證的缺省實現, 基於該包的支持,咱們只須要作一些配置工做便可實現 JDBC 認證。
JDBC 認證方法支持多種數據庫,在此咱們以 Mysql 數據庫爲例 :
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver" /> <property name="url" value="jdbc:mysql://localhost:3306/portaldb? useUnicode=true&characterEncoding=UTF-8&useFastDateParsing=false" /> <property name="username" value="username" /> <property name="password" value="password" /> </bean />
其中 id 屬性爲該 dataSource 的標識,在後面配置 authenticationManager 會被引用, 另外,須要提供 dataSource 所必需的數據庫驅動程序、鏈接地址、數據庫登陸用戶名以及登陸密碼。
修改 cas.properties 配置文件
host.name=cas server.prefix=http://localhost:8080/cas database.hibernate.dialect=org.hibernate.dialect.MySQLDialect
CAS 默認使用了一套簡單的密碼驗證,在 deployerConfigContext.xml 配置文件中, 爲認證管理接口 authenticationManager 配置了屬性 authenticationHandlers 處理器, 其中:<bean class="org.jasig.cas.authentication.handler.support.SimpleTestUsernamePasswordAuthenticationHandler" /> 就是默認的認證處理邏輯,咱們能夠在下載到的壓縮包找到他的源代碼:cas-server-core\src\main\java\org\jasig\cas\authentication\handler\support\SimpleTestUsernamePasswordAuthenticationHandler.java,
public boolean authenticateUsernamePasswordInternal (final UsernamePasswordCredentials credentials) { final String username = credentials.getUsername(); final String password = credentials.getPassword(); if (StringUtils.hasText(username) && StringUtils.hasText(password) && username.equals(getPasswordEncoder().encode(password))) { log.debug("User [" + username + "] was successfully authenticated."); return true; } log.debug("User [" + username + "] failed authentication"); return false; }
默認的用戶名和密碼認證方式是隻要校驗用戶名和密碼相同,則認證經過。所以咱們要對這種認證方式進行修改, 改成用戶名和密碼都採用 Liferay 中用戶的校驗方式。將默認的認證類註釋掉,配置提供的 jdbc 認證:
<!-- <bean class="org.jasig.cas.authentication.handler.support. SimpleTestUsernamePasswordAuthenticationHandler" /> --> <bean class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler" > <property name="sql" value="select password_ from user_ where screenName=?"/> <property name="dataSource" ref="dataSource"/> <property name="passwordEncoder" ref="mypasswordEncoder"/> </bean>
屬性 sql 配置爲查詢 Liferay 數據庫表 user_,字段 password_ 和 screenName 其中 passwordEncoder 是對清單 7 中設置的實際加密器類的引用。 爲了使用 Liferay 的密碼加密方式,咱們須要配置一個咱們本身開發的密碼加密類:
<bean id="mypasswordEncoder" class="com.test.portal.cas.MyPasswordEncoder"> <constructor-arg value="SHA"/> </bean>
在此咱們採用和 Liferay 一致的默認加密算法「SHA」,在調用 Liferay 提供的加密算法時, 咱們須要將 Liferay 的幾個 jar 包引入到咱們的 cas 工程中,自定義的加密算法也很簡單, 只須要調用 jar 包中的加密工具類提供的加密算法便可,同時自定義的類須要繼承 PasswordEncoder 接口:
import javax.validation.constraints.NotNull; import org.jasig.cas.authentication.handler.PasswordEncoder; import com.liferay.portal.kernel.util.DigesterUtil; public final class MyPasswordEncoder implements PasswordEncoder { @NotNull private final String algorithm; public MyPasswordEncoder(final String algorithm) { this.algorithm = algorithm; } public String encode(final String password) { String pass = DigesterUtil.digest(algorithm,password); return pass; } }
至此 CAS 部分的配置就完成了,只須要再 Liferay 中進行相應的設置之後就可使用了。
使用有管理權限的用戶登陸 Liferay,在控制面板中進入「設置」頁面。再右側的面板中選擇「認證」, 進入 Liferay 認證設置。在用戶如何認證的選項中選擇「按屏幕名稱」。選擇「CAS」設置頁面,選中「開啓」, 修改登陸 URL:http://demo1:8080/cas/login,修改註銷 URL:http://demo1:8080/cas/logout, 修改服務器名稱:demo1:8080,修改服務器 URL:http://demo1:8080/cas, 修改無用戶時重定向的 URL:http://demo1:8080,點擊測試 CAS 配置,驗證經過後,保存配置。
至此 Liferay 的配置也已經完成,此時點擊「註銷」用戶,則根據配置,系統會跳轉到 CAS 服務器的登陸界面。使用 Liferay 的用戶登陸, CAS 服務器會連接 Liferay 的數據庫進行認證,認證成功後會跳轉到 Liferay 的首頁,表示 CAS 和 Liferay 的鏈接配置完成。
配置好 CAS 與 Liferay 的集成之後,咱們能夠經過 CAS 服務器進行單點登陸,這樣 Liferay 門戶中集成的 Web 應用就能夠採用 CAS 做爲單點登陸的服務器。 在實際使用中,還須要實現用戶的同步,其餘 Web 應用中的用戶信息須要與 Liferay 數據庫中的數據保持同步, 用戶信息的同步可使用 Liferay 提供的接口從 Liferay 的數據庫中同步,也可使用第三方的用戶目錄服務器進行同步, 具體的同步方法在此不作過多說明。
本文介紹了 使用 Liferay 集成 CAS 實現單點登陸的解決方案,並結合實例講解了在 Liferay 中使用 CAS 的配置、部署方法以及效果。 Liferay 是做爲開源門戶解決方案的一個不錯選擇,更多的使用細節能夠參考 Liferay 官方網站。