0

我试图了解 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 A 不应该为分配给 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‌​&gt;
</method-permission‌​&gt;
4

1 回答 1

1

你在这里有错误的一端。

添加时:

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

对于 bean 定义,这告诉 WebLogic 应该将什么角色应用于它自己发起的对该 bean 的任何调用,而不是用户发起的调用。

即这个安全身份将应用于 EJB 计时器方法和onMessageMDB 的方法(如果我没记错的话,一些内务操作)。

带有该<run-as-role-assignment>...</run-as-role-assignment>元素的 WebLogic 扩展将定义的主体添加到这些方法调用,以便javax.ejb.EJBContext.getCallerPrincipal()anonymous在这些方法调用之一期间返回其他内容。

在所有其他情况下,此安全信息通常从 Web 应用程序的登录用户的身份传播。

通常,用户将通过基于 servlet 的 Web 应用程序进行身份验证,该 Web 应用程序连接到应用程序服务器提供的安全域。然后,servlet 容器会将传入的 HTTP 请求与用户主体相关联。该用户主体必须与一个或多个“角色”相关联,然后才能执行基于角色的访问(以供应商相关的方式完成,但通常与 JAAS 相关联)。如果用户没有角色,容器将拒绝任何调用 servlet 或下游 EJB 的尝试,这些 EJB 已受部署描述符中的安全角色声明或关联的@javax.annotation.security.RolesAllowed保护注释。servlet 容器建立的安全上下文通过后续的 EJB 调用链传播,直到它成功返回或被安全角色阻止。

有关更多信息,请参阅 Servlet 规范和 EJB 规范的“安全”章节。

于 2017-09-25T01:23:37.877 回答