歡迎您光臨本站 註冊首頁

使用 WebSphere Application Server Community Edition 配置 EJB

←手機掃碼閱讀     火星人 @ 2014-03-12 , reply:0
  
由於 WebSphere® Application Server Community Edition v2.x 中引入了憑據庫、Run-as 主體和預設主體,因此其安全性配置與之前版本有所不同。本文將介紹如何使用 WebSphere Application Server Community Edition V2.x 配置 EJB 應用程序安全性。您可以通過本文熟悉各種安全相關的註釋、EJB 部署描述符中的元素以及 Community Edition 特定的部署計劃,用於保護會話、實體和消息驅動的 EJB 的安全。

引言

保護 Enterprise Java Bean (EJB) 的安全是 Java EE 應用程序安全性最重要的方面。IBM WebSphere Application Server Community Edition v2.1(以下稱為 Community Edition)是免費的 Java Enterprise Edition 5.0 (Java EE5) 認證應用伺服器,基於為保護 EJB 應用程序而提供的 Apache Geronimo v2.1。Community Edition 使用 Apache OpenEJB 作為 EJB 容器。EJB 的身份驗證和授權配置方法為:在部署描述符中定義安全形色,每個方法將依據部署描述符執行。然後將安全形色映射到 Community Edition 特定部署計劃中的主體。

在本文中,我們將討論可使用 Community Edition 來保護會話、實體和消息驅動的 EJB 的不同選項。我們還將開發一些 EJB 應用程序來演示各種安全性配置。為了遵循本文所述進行操作,您需要 WebSphere Application Server Community Edition v2.1。





沒有安全性的簡單 EJB 應用程序

接下來讓我們看一個未配置安全性的簡單 EJB 應用程序。此應用程序包含一個 EJB2.1 無狀態會話 Bean 和一個 EJB3 無狀態會話 Bean。清單 1 顯示了此應用程序的部署描述符 ejb-jar.xml。


清單 1. 顯示 Bean 定義的部署描述符
				  <?xml version="1.0" encoding="UTF-8"?>  <ejb-jar ...>      <display-name>SimpleEjbApp</display-name>      <enterprise-beans>          <session>              <description>Simple Session Bean</description>              <display-name>SimpleSessionBean</display-name>              <ejb-name>SimpleSessionBean</ejb-name>              <home>simple.ejb21.SimpleServiceHome</home>              <remote>simple.ejb21.SimpleService</remote>              <local-home>simple.ejb21.SimpleServiceLocalHome</local-home>              <local>simple.ejb21.SimpleServiceLocal</local>              <ejb-class>simple.ejb21.SimpleServiceBean</ejb-class>              <session-type>Stateless</session-type>              <transaction-type>Container</transaction-type>          </session>      </enterprise-beans>  </ejb-jar>  

請注意,此部署描述符僅僅顯示了一個 Bean 定義,即 SimpleSessionBean。我們通過在 Bean 類中使用註釋來指定 EJB3 會話 Bean 的部署描述符。清單 2 顯示了 Simple3ServiceBean 的 Bean 類。


清單 2. Simple3ServiceBean 類
				  import  javax.ejb.Stateless;  ...    @Stateless  public class Simple3ServiceBean implements Simple3Service {    	  public String commonMethod(){  		  ...  	  }    	  public String userMethod(){  		  ...  	  }    	  public String adminMethod(){  		  ...  	  }  	    	  public String noaccessMethod(){  		  ...  	  }  }  

在此示例中,@Stateless 註釋指定 Simple3ServiceBean 是無狀態會話 Bean。

兩個會話 Bean SimpleSessionBean 和 Simple3ServiceBean 沒有配置任何安全性,因此所有方法的訪問都沒有限制。此應用程序的部署計劃 openejb-jar.xml 如清單 3 中所示。


清單 3. 簡單 EJB 應用程序的部署計劃
				  <openejb-jar ...>      <environment>          <moduleId>              <groupId>dw</groupId>              <artifactId>simple-ejb-app</artifactId>              <version>1.0</version>              <type>jar</type>          </moduleId>          <dependencies/>          <hidden-classes/>          <non-overridable-classes/>      </environment>      <enterprise-beans>          <session>              <ejb-name>SimpleSessionBean</ejb-name>              <jndi-name>ejb/SimpleSessionBean</jndi-name>          </session>      </enterprise-beans>  </openejb-jar>  

此 EJB 應用程序部署在 ID 為 dw/simple-ejb-app/1.0/jar 的模塊下。請注意,在此應用程序中,我們將使用 moduleId 元素下的信息對 EJB 進行映射,在本文稍後將看到這一點。





用於演示 EJB 安全性的簡單 Web 應用程序

在本文中,我們使用一個簡單的 Web 應用程序來演示 EJB 安全性。此 Web 應用程序使用兩個安全形色,即“bank”和“customer”。此 Web 應用程序包括一個無訪問限制的主頁和兩個可由“bank”和“customer”角色訪問的安全頁。每個頁面都訪問 SimpleSessionBean 和 Simple3ServiceBean 方法,並顯示此方法的結果或方法調用所引發的任何異常。清單 4 顯示了 web.xml 部署描述符。


清單 4. 簡單 Web 應用程序的部署描述符
				  <web-app ...>      <display-name>simple-web-app</display-name>      <welcome-file-list>          <welcome-file>index.jsp</welcome-file>          ...      </welcome-file-list>        <login-config>          <auth-method>FORM</auth-method>          <realm-name>Not required for FORM auth</realm-name>          <form-login-config>              <form-login-page>/login/login.jsp</form-login-page>              <form-error-page>/login/loginerror.jsp</form-error-page>          </form-login-config>      </login-config>        <security-role>          <role-name>customer</role-name>      </security-role>      <security-role>          <role-name>bank</role-name>      </security-role>      <security-constraint>          <web-resource-collection>              <web-resource-name>Customer</web-resource-name>              <url-pattern>/customer/*</url-pattern>              <http-method>GET</http-method>              <http-method>POST</http-method>          </web-resource-collection>          <auth-constraint>              <role-name>customer</role-name>                   <!-- This comes from the security-role element -->          </auth-constraint>      </security-constraint>      <security-constraint>          <web-resource-collection>              <web-resource-name>Bank</web-resource-name>              <url-pattern>/bank/*</url-pattern>              <http-method>GET</http-method>              <http-method>POST</http-method>          </web-resource-collection>          <auth-constraint>              <role-name>bank</role-name>                      <!-- This comes from the security-role element -->          </auth-constraint>      </security-constraint>        <ejb-ref>          <ejb-ref-name>ejb/SimpleService</ejb-ref-name>          <ejb-ref-type>Session</ejb-ref-type>          <home>simple.ejb21.SimpleServiceHome</home>          <remote>simple.ejb21.SimpleService</remote>      </ejb-ref>      <ejb-ref>          <ejb-ref-name>ejb/Simple3Service</ejb-ref-name>          <ejb-ref-type>Session</ejb-ref-type>          <remote>simple.ejb3.Simple3Service</remote>      </ejb-ref>      ....  </web-app>  

此 Web 應用程序使用 login-config 元素中定義的表單身份驗證。兩個安全形色使用 security-role 元素定義。我們使用 security-constraint 標記配置資源集合的安全許可權。在此示例中,bank 角色中的用戶可以訪問模式為 /bank/* 的 URL,而 customer 角色中的用戶可以訪問模式為 /customer/* 的 URL。

我們使用 ejb-ref 元素聲明 EJB 引用,以通過遠程 Home 和遠程介面訪問 Bean。在此示例中,我們定義了兩個 EJB 引用,即 ejb/SimpleService 和 ejb/Simple3Service。請注意,沒有為 Simple3Service Bean(EJB3 會話 Bean)定義 Home 介面。可以使用 ejb-local-ref 元素聲明用於通過本地 Home 和本地介面訪問 Bean 的 EJB 引用。

在 geronimo-web.xml Web 應用程序部署計劃中,我們將 web.xml 中定義的 EJB 引用映射到特定的 EJB,並將安全形色映射到主體。清單 5 顯示了示例 Web 應用程序的部署計劃。


清單 5. 簡單 Web 應用程序的部署計劃
				  <web-app ...>      ...      <context-root>simple-web-app</context-root>      <nam:ejb-ref xmlns:nam="http://geronimo.apache.org/xml/ns/naming-1.2">          <nam:ref-name>ejb/SimpleService</nam:ref-name>          <nam:pattern>              <nam:groupId>dw</nam:groupId>              <nam:artifactId>simple-ejb-app</nam:artifactId>              <nam:version>1.0</nam:version>              <nam:name>SimpleSessionBean</nam:name>          </nam:pattern>      </nam:ejb-ref>      <nam:ejb-ref xmlns:nam="http://geronimo.apache.org/xml/ns/naming-1.2">          <nam:ref-name>ejb/Simple3Service</nam:ref-name>          <nam:pattern>              <nam:groupId>dw</nam:groupId>              <nam:artifactId>simple-ejb-app</nam:artifactId>              <nam:version>1.0</nam:version>              <nam:name>Simple3ServiceBean</nam:name>          </nam:pattern>      </nam:ejb-ref>      ...      <security-realm-name>SampleSecurityRealm</security-realm-name>      <app:security ...>          ...          <sec:role-mappings>              <sec:role role-name="customer">                  <sec:principal name="UserGrp"                       class="o.a.g.s.r.providers.GeronimoGroupPrincipal"/>                  ...              </sec:role>              <sec:role role-name="bank">                  <sec:principal name="AdminGrp"                       class="o.a.g.s.r.providers.GeronimoGroupPrincipal"/>              ...              </sec:role>          </sec:role-mappings>      </app:security>  </web-app>  

我們使用 ejb-ref 元素將 EJB 引用映射到特定的 EJB。在本例中,請注意 ejb-ref 下的 ref-name 元素中的值與 web.xml 中的 ejb-ref 下的 ejb-ref-name 元素(請參見清單 4)匹配。類似地,我們使用 ejb-local-ref 元素將 EJB 本地引用映射到特定 EJB。

security-realm-name 元素用於配置針對其對用戶進行身份驗證的安全領域。在此示例中,我們使用的領域名稱為 SampleSecurityRealm。

安全形色映射到 security 元素內的 role-mappings 元素下的主體。我們對每個要映射的安全形色使用一個 role 元素。安全形色的名稱在 role 元素的 role-name 屬性中指定。我們使用 role 元素內的 principal 元素指定映射到安全形色的主體。在此示例中,我們將 bank 角色映射到名為 AdminGrp 的 GeronimoGroupPrincipal,將 customer 角色映射到名為 UserGrp 的 GeronimoGroupPrincipal。有關主體到角色的映射的詳細信息,請參見“參考資料”部分提供的在 WebSphere Application Server Community Edition V2.0 中配置 Web 應用程序安全性的鏈接。





運行沒有 EJB 安全性的示例應用程序

現在我們將運行訪問 EJB 應用程序中的 EJB 的簡單 Web 應用程序。請注意,目前我們尚未給 EJB 配置安全性。在繼續之前,請下載示例存檔,並將其提取到您選擇的目錄,(我們將會把此目錄稱為 <SAMPLES_HOME> ),並將 dw_users.properties 和 dw_groups.properties 文件複製到 <WASCE_HOME> /var/security 目錄( <WASCE_HOME> 指代 Community Edition 安裝目錄)。

要運行示例應用程序,請按下列步驟操作:

  1. 啟動 Community Edition,並在瀏覽器中打開 http://localhost:8080/console/。
  2. 在 user name 欄位輸入 system,在 password 欄位輸入 manager。單擊 Login,將隨即在管理控制台中打開 Welcome 頁。
  3. 導航到 Deploy New Portlet。
  4. 在 Plan 欄位下,導航到 <SAMPLES_HOME> 並選擇文件 SampleSecurityRealm-plan.xml。
  5. 單擊 Install,以完成安全領域部署。
  6. 在 Archive 欄位下,導航到 <SAMPLES_HOME> 並選擇 simple-ejb-app.jar。
  7. 單擊 Install,以完成 EJB 應用程序部署。
  8. 在 Archive 欄位下,導航到 <SAMPLES_HOME> 並選擇 simple-web-app.war。
  9. 單擊 Install,以完成 Web 應用程序部署。
  10. 訪問 http://localhost:8080/simple-web-app,會顯示圖 1 中所示的屏幕。

    圖 1. Web 應用程序主頁


    User Info 部分顯示 Web 應用程序中當前登錄的用戶的 UserPrincipal 和 User Roles。EJB2.1 部分顯示調用 SimpleSessionBean 中的每個方法的結果。EJB3 部分顯示調用 Simple3ServiceBean 中的每個方法的結果。由於我們尚未登錄到應用程序,因此 UserPrincipal 和 UserRole 為空。由於沒有為任何 EJB 方法配置安全性,因此所有方法都可訪問,並作為未經身份驗證的用戶被調用。

  11. 訪問 http://localhost:8080/simple-web-app/bank。使用用戶 dwadmin 和密碼 admin 登錄,如圖 2 中所示。

    圖 2. Web 應用程序銀行頁


    請注意,UserPrincipal 顯示已登錄用戶為 dwadmin,UserRole 為 bank。由於沒有為任何 EJB 方法配置安全性,因此所有方法都可訪問,並以未經身份驗證的用戶進行調用。

到目前為止,我們看到的都是 Web 應用程序使用無限制的方法訪問調用 EJB2.1 和 EJB3 會話 Bean。接下來,我們將配置 EJB2.1 和 EJB3 會話 Bean 的方法許可權。





EJB2.1 部署描述符中的安全性配置

EJB 應用程序對 Bean 級別和方法級別的安全性使用基於角色的安全性。在此部分,我們將了解如何定義安全形色和配置方法許可權。

定義安全形色

我們在部署描述符文件 ejb-jar.xml 中使用 assembly-descriptor 下的 security-role 元素定義安全形色。role-name 元素指定安全形色的名稱。清單 6 顯示了本文中使用的示例應用程序之一的 ejb-jar.xml 的摘要。


清單 6. 顯示角色定義的組裝描述符
				  <ejb-jar ...>      <display-name>SimpleEjbApp</display-name>      <enterprise-beans>      ...      </enterprise-beans>      <assembly-descriptor>        <security-role>           <description>User role</description>           <role-name>ejbuser</role-name>        </security-role>        <security-role>           <description>Administrator role</description>           <role-name>ejbadmin</role-name>        </security-role>        ...      </assembly-descriptor>  </ejb-jar>  

在此示例中,應用程序定義了兩個角色,即 ejbuser 和 ejbadmin。

配置方法許可權

為了配置安全標識來調用 EJB 中的方法,我們在 ejb-jar.xml 的 enterprise-beans 下的 Bean 定義中使用了 security-identity 元素。我們通過在 ejb-jar.xml 中的 assembly-descriptor 下使用 method-permission 元素定義 Bean 方法許可權。清單 7 顯示了用於配置 SimpleSessionBean 的方法許可權的 EJB 應用程序部署描述符的片段。


清單 7. EJB 應用程序的部署描述符
				  <ejb-jar id="SimpleEjbAppWithSecurity" ...>      <enterprise-beans>          <session>              ...              <ejb-name>SimpleSessionBean</ejb-name>              ...              <security-identity>                  <use-caller-identity />              </security-identity>          </session>          ...      </enterprise-beans>      <assembly-descriptor>          <security-role>          ...          </security-role>          <method-permission>              <role-name>ejbuser</role-name>              <method>                  <ejb-name>SimpleSessionBean</ejb-name>                  <method-name>userMethod</method-name>              </method>          </method-permission>          <method-permission>              <role-name>ejbadmin</role-name>              <method>                  <ejb-name>SimpleSessionBean</ejb-name>                  <method-name>adminMethod</method-name>              </method>          </method-permission>          <method-permission>              <unchecked/>              <method>                  <ejb-name>SimpleSessionBean</ejb-name>                  <method-name>commonMethod</method-name>              </method>          </method-permission>          <method-permission>              <role-name/>              <method>                  <ejb-name>SimpleSessionBean</ejb-name>                  <method-name>noaccessMethod</method-name>              </method>          </method-permission>      </assembly-descriptor>  </ejb-jar>  

接下來我們逐一介紹一下在本示例中使用的各個標記:

  • security-identity 元素指定用於調用 SimpleSessionBean 中的方法的安全標識。
  • use-caller-identity 元素指定將調用方的安全標識用作執行企業 Bean 的方法的安全標識。另一個選項是使用 run-as 元素來指定用於調用 Bean 的方法 Run-as 標識(請參見本文後面的相關內容)。
  • method-permission 的 method 元素指定 Bean 中一個或多個方法的安全許可權。
  • 您可以使用一個或多個 role-name 元素指定許可權,允許訪問此方法的每個角色有一個對應的此元素。單個空白 role-name 元素表明角色對方法沒有訪問許可權。使用 unchecked 元素指定無限制訪問許可權。
  • 方法的 ejb-name 元素指定 EJB 的名稱。method-name 元素指定方法的名稱。method-name 的 “*” 值與 EJB 中的所有方法對應。
  • 特定的 method-name 與該名稱的所有方法對應,包括任何重載方法。要指定重載方法中的特定方法,請使用 method-params 元素。
  • 您可以在 Bean 的 Home、Remote、Local 和 LocalHome 介面中為方法配置 method-permission。要在特定介面中指定方法的許可權,請使用具有對應值的方法下的 method-intf 元素。

在清單 7 中的 SimpleSession Bean 中,我們配置了以下內容:

  • userMethod 方法可由 ejbuser 角色訪問。
  • adminMethod 方法可由 ejbadmin 角色訪問。
  • c ommonMethod 具有無限制的訪問。
  • noaccessMethod 不能由任何角色訪問。




在 EJB3 Bean 中使用註釋進行安全配置

在 EJB3 企業 Bean 中,可以使用安全註釋配置 Bean 級別和方法級別的安全性。在此部分,我們將討論各個安全註釋(@DeclareRoles、@DenyAll、@PermitAll、@RolesAllowed)以及它們如何影響安全性配置。請注意,我們將在本文後面討論 @RunAs 註釋。

定義安全形色

通過對 Bean 類使用 @DeclareRoles 註釋定義安全形色,如清單 8 中所示。


清單 8. 帶 @DeclareRoles 註釋的 Simple3ServiceBean
				  @Stateless  @DeclareRoles({"ejb3user", "ejb3admin"})  public class Simple3ServiceBean implements Simple3Service {  ...  }  

在此示例中,Simple3ServiceBean 定義了兩個安全形色,即 ejb3user 和 ejb3admin。

配置方法許可權

使用 @DenyAll、@PermitAll 和 @RolesAllowed 註釋為企業 Bean 定義許可權。@PermitAll 和 @RolesAllowed 註釋可以應用於 Bean 類和 Bean 方法,而 @DenyAll 註釋只能應用於 Bean 方法。應用於類的註釋適用於類中的所有方法。應用於方法的註釋覆蓋應用於類的任何註釋。清單 9 顯示了 Simple3ServiceBean 類。


清單 9. 帶安全註釋的 Simple3ServiceBean 類
				  @Stateless  @DeclareRoles({"ejb3user", "ejb3admin"})  public class Simple3ServiceBean implements Simple3Service {    	  @Resource  	  private SessionContext ctx;  	          @PermitAll  	  public String commonMethod() {  		  return logCall("commonMethod");  	  }            @RolesAllowed({"ejb3user"})  	  public String userMethod() {  		  return logCall("userMethod");  	  }            @RolesAllowed({"ejb3admin"})  	  public String adminMethod() {  		  return logCall("adminMethod");  	  }  	            @DenyAll  	  public String noaccessMethod() {  		  return logCall("noaccessMethod");  	  }  	    	  private String logCall(String method) {                ...  		  return msg;  	  }  }  

此示例定義了以下訪問配置:

  • commonMethod 具有無限制訪問。
  • userMethod 可由 ejb3user 角色訪問。
  • adminMethod 可由 ejb3admin 角色訪問。
  • noaccessMethod 不能由任何角色訪問。




EJB 部署計劃中的安全形色映射

EJB 部署描述符中定義的安全形色和使用 @DeclareRoles 註釋定義的角色映射到 EJB 部署計劃 openejb-jar.xml 中的主體。清單 10 顯示了 EJB 部署計劃中的主體到角色的映射。


清單 10. 主體到角色的映射
				  <security>      <role-mappings>          <role role-name="ejbuser">              <principal class="o.a.g.s.r.providers.GeronimoGroupPrincipal"                     name="UserGrp"/>          </role>          <role role-name="ejbadmin">              <principal class="o.a.g.s.r.providers.GeronimoGroupPrincipal"                     name="AdminGrp"/>          </role>          <role role-name="ejb3user">              <principal class="o.a.g.s.r.providers.GeronimoGroupPrincipal"                    name="UserGrp"/>          </role>          <role role-name="ejb3admin">              <principal class="o.a.g.s.r.providers.GeronimoGroupPrincipal"                     name="AdminGrp"/>              <principal class="o.a.g.s.r.providers.GeronimoUserPrincipal"                     name="dwuser3"/>          </role>      </role-mappings>  </security>  

請注意, ejb-jar.xml 中和 @DeclareRoles 註釋中的安全形色映射到主體:

  • ejbuser 角色映射到名稱為 “UserGrp” 的 GeronimoGroupPrincipal。
  • ejbadmin 角色映射到名稱為 “AdminGrp” 的 GeronimoGroupPrincipal。
  • ejb3user 角色映射到名稱為 “UserGrp” 的 GeronimoGroupPrincipal。
  • ejb3admin 角色映射到名稱為 “AdminGrp” 的 GeronimoGroupPrincipal 和名稱為 “dwuser3” 的 GeronimoUserPrincipal。

有關主體到角色的映射的詳細信息,請參見在 WebSphere Application Server Community Edition V2.0 中配置 Web 應用程序安全性。





運行使用 EJB 安全性的示例應用程序

導航到 Deploy New Portlet。

  1. 在 Archive 文件下,導航到 < SAMPLES_HOME > 並選擇 simple-ejb-app-w-security.jar。
  2. 選擇 Redeploy application 選項,並單擊 Install。
  3. 導航到 Web App WARs Portlet 並啟動 dw/simple-web-app/1.0/war 。
  4. 訪問 http://localhost:8080/simple-web-app,會顯示圖 3 中所示的屏幕。

    圖 3. 訪問安全 EJB 的 Web 應用程序主頁


    請注意,由於用戶沒有登錄到應用程序,只能從主頁調用 SimpleSessionBean 中的 commonMethod 和 Simple3ServiceBean (具有無限制訪問)。由於 Principal 未得到授權,因此所有其他方法調用都會生成 AccessException 或 EJBAccessException。

  5. 訪問 http://localhost:8080/simple-web-app/bank/。使用名稱 dwadmin 和密碼 admin 登錄,如圖 4 中所示。


    圖 4. 訪問安全 EJB 的 Web 應用程序銀行頁


    由於用戶現在登錄為 dwadmin,Subject 包含名稱為 dwadmin 的 GeronimoUserPrincipal 和名稱為 AdminGrp 的 GeronimoGroupPrincipal。根據角色映射,此用戶映射到 ejbadmin 和 ejb3admin 角色。因此用戶可以訪問 commonMethod(具有無限制訪問)和 adminMethod(可由 SimpleSessionBean 的 ejbadmin 角色和 Simple3ServiceBean 的 ejb3admin 角色訪問)。userMethod 和 noaccessMethod 在調用時會生成 AccessException 或 EJBAccessException。userMethod 可由 ejbuser 角色(Simple3ServiceBean 的 ejb3user 角色)訪問,noaccessMethod 不能由任何角色訪問。

  6. 打開新瀏覽器窗口並訪問 http://localhost:8080/simple-web-app/customer/。使用名稱 dwuser3 和密碼 user3 登錄,如圖 5 中所示。

    圖 5. 訪問安全 EJB 的 Web 應用程序客戶頁


    由於用戶現在登錄為 dwuser3,Subject 包含名稱為 dwuser3 的 GeronimoUserPrincipal 和名稱為 UserGrp 的 GeronimoGroupPrincipal。根據角色映射,此用戶映射到 ejbuser、ejb3user 和 ejb3admin 角色。在 SimpleSessionBean 中,用戶可以訪問 commonMethod(具有無限制訪問)和 userMethod(可由 ejbuser 角色訪問)。在 Simple3ServiceBean 中,用戶可以訪問 commonMethod(具有無限制訪問)、userMethod(可由 ejb3user 角色訪問)和 adminMethod(可由 ejb3admin 角色訪問)(請參見 EJB2.1 部署描述符中的安全性配置)。所有其他方法在調用時都會生成 AccessException 或 EJBAccessException。





Run-as 主體和預設主體

除了配置 Bean 的方法的方法許可權外,還為 Bean 配置 Run-as 角色,以指定 Bean 用於調用其他 Bean 的安全標識。此配置在 Bean 的方法需要使用其他安全標識(不是調用此方法時使用的標識)調用其他 Bean 時非常有用,例如,無需安全標識即可調用的消息驅動的 Bean 方法調用安全會話 Bean 方法時。在部署計劃中配置安全憑據,以構成 Run-as 角色安全性的主體。

在 V2.0 之前的 Community Edition 中,Run-as 主體和預設主體的安全性配置是使用通過 default-principal 標記和主體的 designated-run-as 屬性指定的主體和憑據構造的。從 Community Edition 2.0 開始,源自主體的所有安全性流都登錄到安全領域。要使用這些主體,需要提供每個此類主體的登錄信息。此登錄信息在憑據庫中捕獲。





憑據庫

Community Edition 提供了憑據庫的實現,即允許在部署計劃中使用 XML 配置憑據庫的 SimpleCredentialStoreImpl。清單 11 顯示了我們在本文的示例應用程序中使用的憑據庫。


清單 1. 憑據庫 gbean
				  <gbean name="SampleCredentialStore"         class="o.a.g.s.credentialstore.SimpleCredentialStoreImpl" ...>      <xml-attribute name="credentialStore">          <credential-store                 xmlns="http://geronimo.apache.org/xml/ns/credentialstore-1.0">              <realm name="SampleSecurityRealm">                  <subject>                  <id>dwuser1-subject</id>                      <credential>                          <type>o.a.g.s.credentialstore.NameCallbackHandler</type>                          <value>dwuser1</value>                      </credential>                      <credential>                          <type>o.a.g.s.credentialstore.PasswordCallbackHandler</type>                          <value>user1</value>                      </credential>                  </subject>                  <subject>                      <id>dwuser2-subject</id>                      ...                  </subject>                  <subject>                      <id>dwuser3-subject</id>                      ...                  </subject>                  <subject>                      <id>dwadmin-subject</id>                      ...                  </subject>              </realm>              <realm name="AnotherRealm">                  <subject>                  ...                  </subject>                  ...              </realm>          </credential-store>      </xml-attribute>  </gbean>      

其中,realm 元素的 name 屬性指定用於創建 subject 的 security-realm。subject 元素下的 id 元素為 subject 指定 ID,可在配置 Run-as 主體和預設主體時與 security-realm 名稱結合使用,詳見後文中所述。

在 subject 下使用 credential 元素配置 security-realm 的登錄信息。在清單 11 中,我們使用用戶名 dwuser1 和密碼 user1 登錄到 SampleSecurityRealm 獲得了 dwuser1-subject。當前 Community Edition 提供針對名稱和密碼的回調處理程序,足以使用需要名稱和密碼進行身份驗證的安全領域。為了使用憑據庫的其他安全領域(例如,使用數字證書的安全領域),您需要實現所需的回調處理程序。另外,憑據庫可以按應用程序配置,或者可以擁有供所有應用程序使用的一個憑據庫。





配置應用程序來使用憑據庫

由應用程序使用的憑據庫在應用程序的部署計劃中的安全配置中指定。清單 12 顯示了用於本文使用的示例應用程序之一的安全配置。


清單 12. 顯示 credential-store-ref 的安全配置
				  <security>      <credential-store-ref>          <name xmlns="http://geronimo.apache.org/xml/ns/deployment-1.2">               SampleCredentialStore</name>      </credential-store-ref>      ...  </security>  

在此示例中,credential-store-ref 下的 name 元素指定應用程序使用的憑據庫。請注意,此值與清單 11 中所示的憑據庫 gbean 的 name 屬性匹配。





配置 Run-as 主體和預設主體

應用程序的 Run-as 主體和預設主體在應用程序的部署計劃的安全配置中指定。如果未為任何角色配置 Run-as 主體,則將轉而使用所配置的預設主體。清單 13 顯示了用於本文使用的示例應用程序之一的 Run-as 主體和預設主體。


清單 13. 顯示 Run-as 和預設主體的安全配置
				  <security>      ...      <default-subject>          <realm>SampleSecurityRealm</realm>          <id>dwuser1-subject</id>      </default-subject>      <role-mappings>          <role role-name="ejb3user">              <run-as-subject>                  <realm>SampleSecurityRealm</realm>                  <id>dwuser3-subject </id>              </run-as-subject>              <principal class="o.a.g.s.r.providers.GeronimoGroupPrincipal" name="UserGrp"/>          </role>          <role role-name="another">          ...          </role>          ...      </role-mappings>  </security>  

security 元素下的 default-subject 元素配置應用程序使用的預設主體。default-subject 下的 realm 元素指定安全領域,id 元素指定憑據庫中所配置的主體的 ID。請注意,為 default-subject 下的 realm 指定的值與清單 11 中的 realm 元素的 name 屬性匹配。另請注意,為 default-subject 下的 id 指定的值與清單 11 中的主體之一的 id 匹配。

role-mappings 下的 role 元素的 run-as-subject 元素配置該角色的 Run-as 主體。清單 13 顯示了為 ejb3user 角色配置的 Run-as 主體。請注意,為 run-as-subject 下的 realm 指定的值與清單 11 中的 realm 元素的 name 屬性匹配。另請注意,為 run-as-subject 下的 id 指定的值與清單 11 中的主體之一的 id 匹配。





使用 Run-as 的示例 EJB 應用程序

我們已經添加了兩個會話 Bean(Simple3ServiceBean2 和 Simple3SeviceBean3),這兩個會話 Bean 將調用 Simple3ServiceBean 中對應的方法。我們將 Simple3ServiceBean2 配置為使用 ejb3user 角色運行。Simple3ServiceBean3 未使用 Run-as 角色配置。清單 14 顯示了 Simple3ServiceBean2 Bean 類。


清單 14. Simple3ServiceBean2 類
				  @Stateless  @DeclareRoles(value = {"ejb3user", "ejb3admin"})  @RunAs("ejb3user")  public class Simple3ServiceBean2 implements Simple3Service2 {    	  @EJB  	  private Simple3Service simple; // Simple3Service injected here  	          @PermitAll  	  public String commonMethod() {            Object temp;            try {                temp = simple.commonMethod();            } catch(Throwable t) {                temp = t;            }            return logCall("commonMethod") + "::" + temp;  	  }            @RolesAllowed({"ejb3user"})  	  public String userMethod() {              ...  	  }            @RolesAllowed({"ejb3admin"})  	  public String adminMethod() {              ...  	  }  	            @DenyAll  	  public String noaccessMethod() {              ...  	  }  	          private String logCall(String method) {              ...  	  }  }  

在此示例中,我們使用了帶 ejb3user 角色的 @RunAs 註釋為 Simple3ServiceBean2 配置 Run-as 角色。通過此配置,對 Simple3Service 的方法調用將按照部署計劃中指定的使用 Run-as 主體。請注意,ejb3user 角色的 Run-as 主體指定為 dwuser3-subject(請參見清單 13)。





運行使用 Run-as EJB 安全性的示例應用程序

  1. 導航到 Deploy New Portlet。
  2. 部署示例中提供的 simple-ejb-app-w-runas.jar。確保在單擊 Install 前選擇 Redeploy application 選項。
  3. 導航到 Web App WARs Portlet 並啟動 dw/simple-web-app/1.0/war。
  4. 訪問 http://localhost:8080/simple-web-app。向下滾動到 RunAs 部分,如圖 6 中所示。

    圖 6. 訪問採用 Run-as 的 EJB 的 Web 應用程序主頁


    請注意,在 RunAs 部分中,Simple3ServiceBean2 中的 commonMethod 使用未經身份驗證的用戶調用,但 Simple3ServiceBean 中的 commonMethod 按照 Run-as 主體的配置使用 dwuser3 調用。由於 Simple3ServiceBean3 未配置 Run-as 角色,因此 Simple3ServiceBean 中的 commonMethod 使用未經身份驗證的用戶調用。

  5. 訪問 http://localhost:8080/simple-web-app/customer/。以名稱 dwuser1 和密碼 user1 登錄。向下滾動到 RunAs 部分,如圖 7 中所示。

    圖 7. 訪問採用 Run-as 的 EJB 的 Web 應用程序客戶頁


請注意,在 RunAs 部分,Simple3ServiceBean2 中的 commonMethod 和 userMethod 使用 dwuser 1 調用,即當前登錄到 Web 應用程序的用戶。不過,在 Simple3ServiceBean 中的 commonMethod 和 userMethod 按照 Run-as 主體的配置使用 dwuser3 調用。由於 Simple3ServiceBean3 未配置 Run-as 角色,因此 Simple3ServiceBean 中的 commonMethod 和 userMethod 使用未經身份驗證的用戶調用。





配置實體 Bean 安全性

可以按照處理會話 Bean 安全性相同的方式使用部署描述符和安全註釋配置實體 Bean 安全性。清單 15 顯示了帶實體 Bean 的示例 EJB 應用程序的組裝描述符。


清單 15. 組裝描述符
				      <assembly-descriptor>         <security-role>             <description>Bank Manager</description>             <role-name>manager</role-name>         </security-role>         <method-permission>             <role-name>manager</role-name>             <method>                 <ejb-name>MyBank</ejb-name>                 <method-name>create</method-name>             </method>         </method-permission>     </assembly-descriptor>  

在此示例中,我們在 MyBank 實體 Bean 的 Home 介面上將 create 方法配置為只能由 manager 角色進行訪問。





運行實體 Bean 示例應用程序

示例中提供的 MyBankEJB 示例應用程序包含單個 EJB2.1 實體 Bean,名為 MyBank。我們在 Bean 的 LocalHome 和 Home 介面中將 create 方法配置為只能由 manager 角色訪問。

請遵循以下步驟來運行此應用程序:

  1. 導航到 Deploy New Portlet。
  2. 在 Archive 欄位中,瀏覽到 <SAMPLES_HOME> 並選擇 bank-db-pool.rar。
  3. 單擊 Install,以部署 MyBankEJB 應用程序使用的資料庫池。
  4. 在 Archive 欄位中,瀏覽到 <SAMPLES_HOME> 並選擇 MyBankEJB.rar。
  5. 單擊 Install,以部署 MyBankEJB 應用程序。
  6. 在 Archive 欄位中,瀏覽到 < SAMPLES_HOME > 並選擇 MyBankWeb.rar。
  7. 單擊 Install,以部署 MyBankWeb 應用程序。
  8. 訪問 http://localhost:8080/MyBankWeb。

    請注意,所顯示的頁面指示在 Create an account 部分出現了異常,因為用戶尚未登錄。

  9. 現在訪問 http://localhost:8080/MyBankWeb/manager

您會注意到所顯示的頁面現在顯示帳戶創建成功。之所以成功,是因為頁面使用 Run-as 角色配置為使用用戶 ID dwadmin 訪問 MyBank Bean,此用戶 ID 在 MyBankEJB 部署計劃中配置為映射到 manager 角色。





配置消息驅動的 Bean 安全性

與會話 Bean 和實體 Bean 不同,消息驅動的 Bean 不會由其他 Bean 或客戶端應用程序調用。它們在消息到達 JMS 偵聽器監視的輸入目的地時由此偵聽器調用。消息驅動的 Bean 可以調用其他會話 Bean 和實體 Bean。要從消息驅動的 Bean 調用安全 EJB,需要為消息驅動的 Bean 配置 Run-as 角色。對於 EJB2.1 消息驅動的 Bean,可以在部署描述符中使用 security-identity 元素配置 Run-as 角色。對於 EJB3 消息驅動的 Bean,可以使用 @RunAs 註釋配置 Run-as 角色。





運行消息驅動的 Bean 示例應用程序

為了演示 EJB3 消息驅動的 Bean 的 Run-as 安全性,我們在示例中提供了一個應用程序 (jms-mdb-sample-ear-2.1.0.1.ear)。此應用程序包括一個名為 OrderRecvMDB 的消息驅動的 Bean 和一個名為 Simple30ServiceBean 的無狀態會話 Bean。我們將會話 Bean 的 userMethod 配置為可由 ejb3user 角色訪問,OrderRecvMDB Bean 配置了 Run-as 角色 ejb3user。在部署計劃中,安全性配置為 ejb3user 角色指定了 Run-as 主體 dwuser1-subject。清單 16 顯示了 OrderRecvMDB Bean 類:


清單 16. OrderRecvMDB Bean 類
				  import javax.annotation.security.RunAs;  ...    //  // MessageDrivenBean that listens to items on the  // 'OrderQueue' queue and processes them accordingly.  //  @MessageDriven(activationConfig = {         @ActivationConfigProperty(propertyName="destinationType",              propertyValue="javax.jms.Queue"),         @ActivationConfigProperty(propertyName="destination",              propertyValue="OrderQueue")     })  @RunAs("ejb3user")                 public class OrderRecvMDB implements MessageListener {  	  	@EJB  	private Simple30Service simple; // Session bean is injected    	/*       * Process a message.       *        * @param message The message to process.        */      public void onMessage(Message message) {          TextMessage textMessage = (TextMessage) message;          try {              System.out.println("Order Received \n"+ textMessage.getText());              simple.userMethod();          } catch ( JMSException e ) {              e.printStackTrace();          }      }  }  

請遵循以下步驟來運行此應用程序:

  1. 導航到 Deploy New Portlet。
  2. 在 Archive 欄位中,瀏覽到 < SAMPLES_HOME > 並選擇 jms-mdb-sample-ear-2.1.0.1.ear。
  3. 單擊 Install,以部署示例應用程序。
  4. 訪問 http://localhost:8080/order。
  5. 輸入欄位值,並單擊 Order。

請注意,伺服器控制台窗口中顯示接收到的順序以及關於用於調用 Simple30ServiceBean 中的 userMethod 的安全標識 dwuser1 的詳細信息。





結束語

我們創建了 EJB2.1 和 EJB3 會話 Bean、EJB2.1 實體 Bean,並使用部署描述符和安全註釋為 Bean 方法配置了訪問許可權。我們還為會話 Bean 和消息驅動的 Bean 配置了 Run-as 角色,並創建了所需的構件(如憑據庫)來部署使用此安全配置的 EJB 應用程序。我們還通過使用示例 Web 應用程序調用 EJB 來演示了 EJB 安全性。(責任編輯:A6)



[火星人 ] 使用 WebSphere Application Server Community Edition 配置 EJB已經有450次圍觀

http://coctec.com/docs/linux/show-post-68895.html