Junky's IT Notebook

          統(tǒng)計(jì)

          留言簿(8)

          積分與排名

          WebSphere Studio

          閱讀排行榜

          評論排行榜

          Liferay 安全管理(轉(zhuǎn))

          企業(yè)應(yīng)用整合成為了越來越多的企、事業(yè)單位的當(dāng)務(wù)之急,我所處環(huán)境也不可避免的遇到這個(gè)棘手的問題,各種技術(shù)的交集使得portal技術(shù)有了大顯身手之處。可惜IBMBEA的高額費(fèi)用讓我們望而卻步,自然,開源的portal成為了首選,Liferay是開源社區(qū)里一個(gè)非常活躍的項(xiàng)目:)而且重要的是其技術(shù)架構(gòu)如圖1,也和我們現(xiàn)在的技術(shù)路線相近,所以我們決定采用Liferay(版本:liferay-portal-src-4.1.2)作為基礎(chǔ)來進(jìn)行應(yīng)用開發(fā)和系統(tǒng)整合。

          圖1 Liferay技術(shù)架構(gòu)

           
           

          要用好這個(gè)基礎(chǔ)平臺(tái),必須要對她的自身實(shí)現(xiàn)原理有個(gè)比較清晰的認(rèn)識(shí),以下文章為我在研究Liferay原理時(shí)所做的一些筆記,現(xiàn)整理和分享(由于筆記帶有強(qiáng)烈的個(gè)人思想,有錯(cuò)誤再所難免,希望能對進(jìn)一步的分析做為鋪墊,更歡迎批評指正)。

           

          Liferay Portal

          Liferay JAAS權(quán)限管理

          Liferay的業(yè)務(wù)邏輯管理

          Liferay二次開發(fā)

          Liferay WSRP

           

          Liferay的權(quán)限管理實(shí)現(xiàn)了一個(gè)典型的JAAS管理策略,所以在分析其本身前,在此首先介紹JAAS的驗(yàn)證原理和Tomcat上如何開發(fā)標(biāo)準(zhǔn)JAAS應(yīng)用。

           JAAS驗(yàn)證原理

          JAAS的核心類和接口可以被分為三種類型,大多數(shù)都在javax.security.auth包中。在J2SE 1.4中,還有一些接口的實(shí)現(xiàn)類在com.sun.security.auth包中,如下所示:

          & #61557;       普通類 SubjectPrincipalCredential(憑證)

           Subject類代表了一個(gè)驗(yàn)證實(shí)體,它可以是用戶、管理員、Web服務(wù),設(shè)備或者其他的過程。該類包含了三中類型的安全信息:

          1)        身份(Identities):由一個(gè)或多個(gè)Principal對象表示

          2)        公共憑證(Public credentials):例如名稱或公共密鑰

          3)        私有憑證(Private credentials):例如口令或私有密鑰

            Principal對象代表了Subject對象的身份。它們實(shí)現(xiàn)了java.security.Principaljava.io.Serializable接口。在Principal類中,最重要的方法是getName()。該方法返回一個(gè)身份名稱。在Subject對象中包含了多個(gè)Principal對象,因此它可以擁有多個(gè)名稱。由于登錄名稱、身份證號(hào)和Email地址都可以作為用戶的身份標(biāo)識(shí),可見擁有多個(gè)身份名稱的情況在實(shí)際應(yīng)用中是非常普遍的情況。

          在上面提到的憑證并不是一個(gè)特定的類或借口,它可以是任何對象。憑證中可以包含任何特定安全系統(tǒng)需要的驗(yàn)證信息,例如標(biāo)簽(ticket),密鑰或口令。Subject對象中維護(hù)著一組特定的私有和公有的憑證,這些憑證可以通過Subject 方法getPrivateCredentials()和getPublicCredentials()獲得。這些方法通常在應(yīng)用程序?qū)又械陌踩酉到y(tǒng)被調(diào)用。

          & #61557;       驗(yàn)證 LoginContextLoginModuleCallBackHandlerCallback

          驗(yàn)證:LoginContext

            在應(yīng)用程序?qū)又校憧梢允褂?/span>LoginContext對象來驗(yàn)證Subject對象。LoginContext對象同時(shí)體現(xiàn)了JAAS的動(dòng)態(tài)可插入性(Dynamic Pluggability),因?yàn)楫?dāng)你創(chuàng)建一個(gè)LoginContext的實(shí)例時(shí),你需要指定一個(gè)配置。LoginContext通常從一個(gè)文本文件中加載配置信息,這些配置信息告訴LoginContext對象在登錄時(shí)使用哪一個(gè)LoginModule對象。

            下面列出了在LoginContext中經(jīng)常使用的三個(gè)方法:

          & #61550;         login () 進(jìn)行登錄操作。該方法激活了配置中制定的所有LoginModule 象。如果成功,它將創(chuàng)建一個(gè)經(jīng)過了驗(yàn)證的Subject對象;否則拋出LoginException異常。

          & #61550;         getSubject () 返回經(jīng)過驗(yàn)證的Subject對象

          & #61550;         logout () 注銷Subject對象,刪除與之相關(guān)的Principal對象和憑證

            驗(yàn)證:LoginModule

            LoginModule是調(diào)用特定驗(yàn)證機(jī)制的接口。J2EE 1.4中包含了下面幾種LoginModule的實(shí)現(xiàn)類:

          & #61550;         JndiLoginModule 用于驗(yàn)證在JNDI中配置的目錄服務(wù)

          & #61550;         Krb5LoginModule 使用Kerberos協(xié)議進(jìn)行驗(yàn)證

          & #61550;         NTLoginModul 使用當(dāng)前用戶在NT中的用戶信息進(jìn)行驗(yàn)證

          & #61550;         UnixLoginModule 使用當(dāng)前用戶在Unix中的用戶信息進(jìn)行驗(yàn)證

           

            同上面這些模塊綁定在一起的還有對應(yīng)的Principal接口的實(shí)現(xiàn)類,例如NTDomainPrincipalUnixPrincipal。這些類在com.sun.security.auth包中。

           

            LoginModule接口中包含了五個(gè)方法:

          1)        initialize () 當(dāng)創(chuàng)建一LoginModule實(shí)例時(shí)會(huì)被構(gòu)造函數(shù)調(diào)用

          2)        login () 進(jìn)行驗(yàn)證,通常會(huì)按照登錄條件生成若干個(gè)Principal對象

          3)        commit () 進(jìn)行Principal對象檢驗(yàn),按照預(yù)定義Principal條件檢驗(yàn)Login生成的Principal對象,所有需要的條件均符合后,把若干個(gè)生成的Principal對象付給Subject對象,JAAS架構(gòu)負(fù)責(zé)回傳給LoginContext.

          4)        abort () 當(dāng)任何一個(gè)LoginModule對象驗(yàn)證失敗時(shí)都會(huì)調(diào)用該方法。任何已經(jīng)和Subject對象綁定的Principal對象都會(huì)被解除綁定。

          5)        logout () 刪除與Subject對象關(guān)聯(lián)的Principal對象和憑證,消除Subject,Principal等認(rèn)證對象。

           驗(yàn)證:CallbackHandlerCallback

            CallbackHandlerCallback對象可以使LoginModule對象從系統(tǒng)和用戶那里收集必要的驗(yàn)證信息,同時(shí)獨(dú)立于實(shí)際的收集信息時(shí)發(fā)生的交互過程。

            

            JAASjavax.sevurity.auth.callback包中包含了七個(gè)Callback的實(shí)現(xiàn)類和兩個(gè)CallbackHandler的實(shí)現(xiàn)類:ChoiceCallbackConfirmationCallbackLogcaleCallbackNameCallbackPasswordCallbackTextInputCallbackTextOutputCallbackDialogCallbackHandlerTextCallBackHandlerCallback接口只會(huì)在客戶端會(huì)被使用到。我將在后面介紹如何編寫你自己的CallbackHandler類。

           

          授權(quán) PolicyAuthPermissionPrivateCredentialPermission

          要了解Liferaytomcat版本)的權(quán)限管理,必須首先了解JAAStomcat上的應(yīng)用。

           

          u          Tomcat服務(wù)器JAAS配置方法

            和在應(yīng)用程序運(yùn)行JAAS不同的是,配置JAAS方法會(huì)有很不一樣。我們使用的是Tomcat 5.0.x 應(yīng)用服務(wù)器,它的JAAS配置方法有數(shù)種,分別是

          & #61557;       JAASRealm

          & #61557;       JDBCRealm

          & #61557;       DataSourceRealm

          & #61557;       JNDIRealm

          & #61557;       MemoryRealm

          JAASRealm

           

          1.         把自定義 LoginModuleUserRole等相關(guān)類放入Tomcat classpath

          2.         把自定義login.config JAAS配置文件配置進(jìn)JVM環(huán)境,例如: JAVA_OPTS=-DJAVA_OPTS=-Djava.security.auth.login.config==$CATALINA_HOME/conf/jaas.config

          3.         設(shè)置 web.xml里的 security-constraints 標(biāo)簽設(shè)定需要保護(hù)的資源

          4.         $CATALINA_HOME/conf/server.xmlengine標(biāo)簽里設(shè)置JAASRealm標(biāo)簽

          以下是JAASRealm標(biāo)簽的詳細(xì)說明

          屬性

          描述

          className

          只需要指定 org.apache.catalina.realm.JAASRealm

          debug

          設(shè)置debug級(jí)別,默認(rèn)為不設(shè)置0

          appName

          JAAS配置文件應(yīng)用名

          userClassNames

          自定義user Principals

          roleClassNames

          自定義 role Principals

          useContextClassLoader

          默認(rèn)為true, 為了向后兼容類裝載方式,使用Tomcat4以上版本ContextLoader裝載方式

           

          以下是完整的tomcat服務(wù)器配置例子:

          %TOMCAT_HOME%/config/server.xml 中添加以下段落

          <Realm className="org.apache.catalina.realm.JAASRealm"            

                          appName="MyFooRealm"      

              userClassNames="org.foobar.realm.FooUser"      

               roleClassNames="org.foobar.realm.FooRole"

                                debug="99"/>

          上面介紹了tomcat的應(yīng)用,而liferaytomcat版本)也是利用了這種標(biāo)準(zhǔn)的tomcatJAAS實(shí)現(xiàn)。

          與權(quán)限管理、用戶認(rèn)證的主要類包為:

          com.liferay.portal.security.auth.*

          com.liferay.portal.service.permission

          com.liferay.portal.struts.PortalRequestProcessor

           

          Liferay關(guān)于JAAS的實(shí)現(xiàn)包都在com.liferay.portal.security.auth.*下,在$catalina_home/conf/jaas.conf中定義了Liferay實(shí)現(xiàn)的loginModule,在我使用的版本中,PortalLoginModule將首先通過對象池取出一個(gè)自定義Liferay用戶自定義的實(shí)現(xiàn),即也可以在portal中再次自定義loginModule。顯然,如果沒有自定義的實(shí)現(xiàn),將根據(jù)用戶所使用的服務(wù)器自動(dòng)進(jìn)行選擇默認(rèn)實(shí)現(xiàn)。

          Liferay自身所實(shí)現(xiàn)的user Principalsrole Principals也僅僅是保存了用戶的userid,以其作為自身標(biāo)識(shí),在登陸成功時(shí)賦予了所有用戶“users”角色:

          PortalRole role = new PortalRole("users");

          getSubject().getPrincipals().add(role);

          LiferayPortalRequestProcessor擴(kuò)展了TilesRequestProcessor,實(shí)現(xiàn)了自定義的請求處理流程。在請求流程中復(fù)寫了processRoles(),在這個(gè)函數(shù)中進(jìn)行了用戶權(quán)限的判斷,從而達(dá)到了對web資源的保護(hù)。

          PermissionLiferay定義的用戶訪問的權(quán)限判斷,由processRoles調(diào)用進(jìn)行訪問控制。

          值得一提的是,Liferay本身也含有登陸模塊,這個(gè)登陸模塊所做的主要工作為通過認(rèn)證確定用戶的登陸信息正確,并通過用戶的登陸信息取得用戶userid存放在session中,為JAAS的登陸模塊提供基礎(chǔ)(即通過登陸的正確用戶id與密碼)。登陸的用戶默認(rèn)為LDAP登陸,但是為默認(rèn)禁用,所以用戶認(rèn)證Liferay都通過一個(gè)數(shù)據(jù)庫的認(rèn)證實(shí)現(xiàn)在loginAction中進(jìn)行的用戶判斷,取出了useridpassword存放在session中。

          整個(gè)過程如下:

           

          如上圖所示,觸發(fā)JAAS的登陸模塊的是在登陸成功后轉(zhuǎn)向了/c/portal/protected,而此路徑為tomcat的安全域,所以tomcat將調(diào)用用戶自定義的登陸模塊進(jìn)行用戶認(rèn)證,通過認(rèn)證后通過對用戶角色的對比,來判斷用戶是否允許訪問。

           圖2 Liferay認(rèn)證流程

            

           

          副錄:幫助進(jìn)行相關(guān)類查看

          SecureFilter->進(jìn)行訪問地址限制和是使用安全連接轉(zhuǎn)換。

          PropsUtilportal-ejb.jar里的portal.property

          MainServlet 擴(kuò)展Strutsaction Serverlet,進(jìn)行映射。

          posted on 2007-05-31 13:45 junky 閱讀(1323) 評論(0)  編輯  收藏 所屬分類: portal

          主站蜘蛛池模板: 柘荣县| 双柏县| 石楼县| 乐东| 永川市| 会同县| 彭山县| 谢通门县| 娱乐| 通海县| 镇远县| 宣城市| 铜鼓县| 奈曼旗| 巴中市| 临海市| 波密县| 开封市| 泽普县| 淄博市| 石泉县| 延寿县| 昌都县| 芜湖县| 江达县| 克拉玛依市| 乌鲁木齐县| 上蔡县| 新邵县| 循化| 吉林市| 建阳市| 隆昌县| 安塞县| 永胜县| 永仁县| 师宗县| 吉安县| 弥勒县| 河南省| 长治县|