1.2. Identidade de Segurança

Um Enterprise Java Bean (EJB) pode especificar a identidade que outro EJB deve usar quando invocando métodos em componentes usando o elemento <security-identity>. A Figura 1.2, “O elemento de identidade de segurança” descreve o elemento <security-identity>, seus elementos filho, e atributos.
O elemento de identidade de segurança

Figura 1.2. O elemento de identidade de segurança

A identidade de invocação pode ser a do chamador atual ou pode ser uma função específica. O assembler do aplicativo usa o elemento <security-identity> com um elemento filho <use-caller-identity>. Isto indica que a identidade do chamador atual deve ser propagada como uma identidade de segurança para as invocações do método realizadas pelo EJB. A propagação da identidade do chamador é o padrão usado na ausência de uma declaração do elemento <security-identity>.
Alternativamente, o assembler do aplicativo pode usar o elemento filho <run-as> ou <role-name> para especificar que uma função de segurança específica suprida pelo valor do elemento role-name> deve ser usada como uma identidade de segurança para invocações de método realizadas pelo EJB.
Perceba que isto não altera a identidade do chamador conforme visto pelo método EJBContext.getCallerPrincipal(). Ao invés disto, as funções de segurança do chamador são configuradas à função única especificada pelo valor do elemento <run-as> ou <role-name>.
Um caso de uso do elemento <run-as> é prevenir os clientes externos de acessarem EJBs internos. Você pode configurar este comportamento determinando os elementos <method-permission> do EJB interno, que restringe o acesso à uma função nunca determinada a um cliente externo. Os EJBs, que devem usar em troca EJBs internos, são então configurados com um <run-as> ou <role-name> igual à função restringida. O seguinte fragmento do descritor descreve uma amostra do uso do elemento <security-identity>.
<!-- A sample ejb-jar.xml fragment -->
<ejb-jar>
    <enterprise-beans>
        <session>
            <ejb-name>ASessionBean</ejb-name>
            <!-- ... -->
            <security-identity>
                <use-caller-identity/>
            </security-identity>
        </session>
        <session>
            <ejb-name>RunAsBean</ejb-name>
            <!-- ... -->
            <security-identity>
                <run-as>
                    <description>A private internal role</description>
                    <role-name>InternalRole</role-name>
                </run-as>
            </security-identity>
        </session>
    </enterprise-beans>
    <!-- ... -->
</ejb-jar>
Quando você usa um <run-as> para determinar uma função específica para chamadas de saída, um principal nomeado anonymous é determinado a todas as chamadas de saída. Caso você deseje que outro principal seja associado com a chamada, você deverá associar um <run-as-principal> com o bean no arquivo jboss.xml. O seguinte fragmento associa um principal nomeado internal com o RunAsBean com a amostra anterior.
<session>
    <ejb-name>RunAsBean</ejb-name>
    <security-identity>
        <run-as-principal>internal</run-as-principal>
    </security-identity>
</session>
O elemento <run-as> encontra-se também disponível nas definições do servlet num arquivo web.xml. A amostra seguinte apresenta como determinar o InternalRole de função a um servlet:
<servlet>
    <servlet-name>AServlet</servlet-name>
    <!-- ... -->
    <run-as> 
        <role-name>InternalRole</role-name>
    </run-as>
</servlet>
As chamadas a partir deste servlet estão associadas com o principal anônimo. O elemento está disponível no arquivo jboss-web.xml para determinar um principal específico juntamente com a função run-as. O seguinte fragmento apresenta como associar um principal nomeado internal ao servlet acima.
<servlet>
    <servlet-name>AServlet</servlet-name>
    <run-as-principal>internal</run-as-principal>
</servlet>