Junky's IT Notebook

          統計

          留言簿(8)

          積分與排名

          WebSphere Studio

          閱讀排行榜

          評論排行榜

          Liferay 安全管理(轉)

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

          圖1 Liferay技術架構

           
           

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

           

          Liferay Portal

          Liferay JAAS權限管理

          Liferay的業務邏輯管理

          Liferay二次開發

          Liferay WSRP

           

          Liferay的權限管理實現了一個典型的JAAS管理策略,所以在分析其本身前,在此首先介紹JAAS的驗證原理和Tomcat上如何開發標準JAAS應用。

           JAAS驗證原理

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

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

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

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

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

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

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

          在上面提到的憑證并不是一個特定的類或借口,它可以是任何對象。憑證中可以包含任何特定安全系統需要的驗證信息,例如標簽(ticket),密鑰或口令。Subject對象中維護著一組特定的私有和公有的憑證,這些憑證可以通過Subject 方法getPrivateCredentials()和getPublicCredentials()獲得。這些方法通常在應用程序層中的安全子系統被調用。

          & #61557;       驗證 LoginContextLoginModuleCallBackHandlerCallback

          驗證:LoginContext

            在應用程序層中,你可以使用LoginContext對象來驗證Subject對象。LoginContext對象同時體現了JAAS的動態可插入性(Dynamic Pluggability),因為當你創建一個LoginContext的實例時,你需要指定一個配置。LoginContext通常從一個文本文件中加載配置信息,這些配置信息告訴LoginContext對象在登錄時使用哪一個LoginModule對象。

            下面列出了在LoginContext中經常使用的三個方法:

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

          & #61550;         getSubject () 返回經過驗證的Subject對象

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

            驗證:LoginModule

            LoginModule是調用特定驗證機制的接口。J2EE 1.4中包含了下面幾種LoginModule的實現類:

          & #61550;         JndiLoginModule 用于驗證在JNDI中配置的目錄服務

          & #61550;         Krb5LoginModule 使用Kerberos協議進行驗證

          & #61550;         NTLoginModul 使用當前用戶在NT中的用戶信息進行驗證

          & #61550;         UnixLoginModule 使用當前用戶在Unix中的用戶信息進行驗證

           

            同上面這些模塊綁定在一起的還有對應的Principal接口的實現類,例如NTDomainPrincipalUnixPrincipal。這些類在com.sun.security.auth包中。

           

            LoginModule接口中包含了五個方法:

          1)        initialize () 當創建一LoginModule實例時會被構造函數調用

          2)        login () 進行驗證,通常會按照登錄條件生成若干個Principal對象

          3)        commit () 進行Principal對象檢驗,按照預定義Principal條件檢驗Login生成的Principal對象,所有需要的條件均符合后,把若干個生成的Principal對象付給Subject對象,JAAS架構負責回傳給LoginContext.

          4)        abort () 當任何一個LoginModule對象驗證失敗時都會調用該方法。任何已經和Subject對象綁定的Principal對象都會被解除綁定。

          5)        logout () 刪除與Subject對象關聯的Principal對象和憑證,消除Subject,Principal等認證對象。

           驗證:CallbackHandlerCallback

            CallbackHandlerCallback對象可以使LoginModule對象從系統和用戶那里收集必要的驗證信息,同時獨立于實際的收集信息時發生的交互過程。

            

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

           

          授權 PolicyAuthPermissionPrivateCredentialPermission

          要了解Liferaytomcat版本)的權限管理,必須首先了解JAAStomcat上的應用。

           

          u          Tomcat服務器JAAS配置方法

            和在應用程序運行JAAS不同的是,配置JAAS方法會有很不一樣。我們使用的是Tomcat 5.0.x 應用服務器,它的JAAS配置方法有數種,分別是

          & #61557;       JAASRealm

          & #61557;       JDBCRealm

          & #61557;       DataSourceRealm

          & #61557;       JNDIRealm

          & #61557;       MemoryRealm

          JAASRealm

           

          1.         把自定義 LoginModuleUserRole等相關類放入Tomcat classpath

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

          3.         設置 web.xml里的 security-constraints 標簽設定需要保護的資源

          4.         $CATALINA_HOME/conf/server.xmlengine標簽里設置JAASRealm標簽

          以下是JAASRealm標簽的詳細說明

          屬性

          描述

          className

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

          debug

          設置debug級別,默認為不設置0

          appName

          JAAS配置文件應用名

          userClassNames

          自定義user Principals

          roleClassNames

          自定義 role Principals

          useContextClassLoader

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

           

          以下是完整的tomcat服務器配置例子:

          %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的應用,而liferaytomcat版本)也是利用了這種標準的tomcatJAAS實現。

          與權限管理、用戶認證的主要類包為:

          com.liferay.portal.security.auth.*

          com.liferay.portal.service.permission

          com.liferay.portal.struts.PortalRequestProcessor

           

          Liferay關于JAAS的實現包都在com.liferay.portal.security.auth.*下,在$catalina_home/conf/jaas.conf中定義了Liferay實現的loginModule,在我使用的版本中,PortalLoginModule將首先通過對象池取出一個自定義Liferay用戶自定義的實現,即也可以在portal中再次自定義loginModule。顯然,如果沒有自定義的實現,將根據用戶所使用的服務器自動進行選擇默認實現。

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

          PortalRole role = new PortalRole("users");

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

          LiferayPortalRequestProcessor擴展了TilesRequestProcessor,實現了自定義的請求處理流程。在請求流程中復寫了processRoles(),在這個函數中進行了用戶權限的判斷,從而達到了對web資源的保護。

          PermissionLiferay定義的用戶訪問的權限判斷,由processRoles調用進行訪問控制。

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

          整個過程如下:

           

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

           圖2 Liferay認證流程

            

           

          副錄:幫助進行相關類查看

          SecureFilter->進行訪問地址限制和是使用安全連接轉換。

          PropsUtilportal-ejb.jar里的portal.property

          MainServlet 擴展Strutsaction Serverlet,進行映射。

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

          主站蜘蛛池模板: 周宁县| 芜湖县| 辽宁省| 浙江省| 盐津县| 广河县| 崇义县| 内黄县| 曲沃县| 科尔| 星座| 绥江县| 宜丰县| 当阳市| 呼和浩特市| 嘉祥县| 绥化市| 宝应县| 山阳县| 西华县| 周至县| 嘉兴市| 合山市| 彰化县| 麻城市| 夹江县| 德惠市| 获嘉县| 揭阳市| 赤水市| 正宁县| 乌兰县| 灵台县| 阿克苏市| 连江县| 潍坊市| 巴彦县| 武威市| 县级市| 梨树县| 柞水县|