2017-09-24 61 views
0

我想了解EJB安全性如何在WebLogic服務器上工作。在Weblogic上配置EJB安全

我有以下ejb-jar.xml中配置

<session> 
    <ejb-name>BeanA</ejb-name> 
     .... 
     <security-identity>    
      <run-as> 
       <role-name>beanA_users</role-name> 
      </run-as> 
     </security-identity> 
</session> 

     <assembly-descriptor> 
      <security-role> 
       <role-name>beanA_users</role-name> 
      </security-role>  
      <container-transaction>  
       <method> 
        <ejb-name>BeanA</ejb-name> 
       <method-name>*</method-name> 
       </method> 
      </container-transaction> 
     </assembly-descriptor> 

,並在weblogic-ejb-jar.xml中的EJB:

<security-role-assignment> 
    <role-name>beanA_users</role-name> 
    <principal-name>runas_a</principal-name> 
</security-role-assignment> 
<run-as-role-assignment> 
    <role-name>beanA_users</role-name> 
    <run-as-principal-name>runas_a</run-as-principal-name> 
</run-as-role-assignment> 

我解釋它是這樣的:BeanA運行作爲beanA_users。 「runas_a」是beanA_users之一。因此,BeanA作爲runas_a用戶運行。此外,beanA_users角色中的所有用戶都可以調用所有的BeanA方法。換句話說,Bean_A作爲runas_a運行,只有runas_a可以調用它的方法。它是否正確?

但是,當我從具有以下配置的另一個EJB中調用此EJB時,我能夠通過。 Bean不應該爲在BeanB中分配給BeanB_users角色的主體配置一個權限?

ejb-jar.xml中:

<session>  
    <ejb-name>BeanB</ejb-name> 
      ... 
     <security-identity>    
      <run-as> 
       <role-name>beanB_users</role-name> 
      </run-as> 
     </security-identity> 
</session> 

的weblogic-ejb-jar.xml中:

<run-as-role-assignment> 
    <role-name>beanB_users</role-name> 
    <run-as-principal-name>runas_b</run-as-principal-name> 
</run-as-role-assignment> 

編輯:

閱讀ejb-jar.xml中的模式,它看起來像後本例中的Bean A沒有在<assembly-descriptor>元素中定義任何權限。它只定義了安全角色。我認爲這就是爲什麼任何EJB都可以調用它的方法。但是爲什麼它在這種情況下定義了安全角色分配?例如,如果BeanA在元素中具有以下內容,那麼是否會阻止BeanB通過,因爲權限不包含runas_b主體?

<method-permission> 
    <role-name>beanA_users</role-name> 
     <method> 
      <ejb-name>BeanA</ejb-n‌​ame> 
       <method-name>*</method-name> 
     </method‌​> 
</method-permission‌​> 

回答

0

你在這裏有錯誤的結尾。

當您添加:

<security-identity>    
     <run-as> 
      <role-name>beanA_users</role-name> 
     </run-as> 
    </security-identity> 

一個bean定義,這個告知WebLogic什麼樣的角色,應適用於任何調用上豆,它鼓動自己,而不是什麼用戶策動。

即這個安全標識將被應用於EJB定時器方法和MDB的onMessage方法(如果我正確地記得,有些內務操作)。

帶有<run-as-role-assignment>...</run-as-role-assignment>元素的WebLogic擴展爲這些方法調用添加了一個定義的委託人,以便javax.ejb.EJBContext.getCallerPrincipal()在其中一個方法調用期間返回除anonymous以外的內容。

在所有其他情況下,此安全信息通常是從Web應用程序的登錄用戶身份傳播的。

通常,用戶將通過基於servlet的Web應用程序進行身份驗證,該應用程序連接到由應用程序服務器提供的安全域。然後,servlet容器將傳入的HTTP請求與用戶主體關聯。在基於角色的訪問可以被執行之前,該用戶主體必須與一個或多個「角色」相關聯(這是以供應商依賴的方式完成的,但通常與JAAS相關聯)。如果用戶沒有角色,那麼容器將拒絕任何嘗試調用已被部署描述符或相關注釋中的安全角色聲明保護的servlet或下游EJB的嘗試。由servlet容器建立的安全上下文通過後續的EJB調用鏈傳播,直到它成功返回或被安全角色阻止。

欲瞭解更多信息,請參閱Servlet規範和EJB規範的「安全性」章節。

+0

什麼調用EJB A? –

+0

但是,如果EJB A調用EJB X的方法,則EJB X可以基於EJB A的「run-as」主體爲其方法設置方法訪問權限。爲此,必須定義自己的安全角色並添加然後在ejb-jar.xml中的元素中爲該安全角色定義權限。我只是想知道爲什麼當我從EJB B調用EJB A時,我可以訪問它的方法。我的猜測是,這是因爲即使安全角色是在Bean A中沒有定義權限。 –

+0

EJB A由EJB B調用。 –