我正在尝试了解EJB安全性如何在WebLogic服务器上工作。
我在ejb-jar.xml中具有以下配置的EJB
<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:
<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_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 principal?
<method-permission>
<role-name>beanA_users</role-name>
<method>
<ejb-name>BeanA</ejb-name>
<method-name>*</method-name>
</method>
</method-permission>
您在这里棍子的末端错误。
添加时:
<security-identity>
<run-as>
<role-name>beanA_users</role-name>
</run-as>
</security-identity>
to bean定义,这告诉weblogic应该在其启动的bean上的任何调用中应用什么角色,而不是用户启动的内容。
即。此安全身份将应用于EJB计时器方法和MDB的onMessage
方法(如果我没记错的话,某些管家操作)。
带有<run-as-role-assignment>...</run-as-role-assignment>
元素的WebLogic扩展名在这些方法调用中添加了定义的主体,以便Javax.ejb.ejbcontext.getCallerPrinCipal()在这些方法调用之一中返回anonymous
以外的其他内容。
在所有其他情况下
通常,用户将通过其基于Servlet的Web应用程序进行身份验证,该应用程序与应用程序服务器提供的安全域联系。然后,servlet容器将将传入的HTTP请求与用户主体相关联。该用户主体必须与一个或多个"角色"关联,然后才能执行基于角色的访问(以供应商的方式完成,但通常与JAAS相关联)。如果用户没有角色,容器将拒绝任何尝试在部署描述符中受到安全角色声明保护或关联 @javax.annotation.annotation.security.security.Roles.RoreSallowed注释的尝试。Servlet容器建立的安全环境通过随后的EJB呼叫链传播,直到成功返回或被安全角色阻止为止。
有关更多信息,请参阅Servlet规范和EJB规范的"安全"章节。