Настройка безопасности EJB в Weblogic

Я пытаюсь понять, как работает защита EJB на сервере 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:

<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_users в BeanB?

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 похоже, что компонент 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‌​>

1 ответ

У вас здесь не тот конец палки.

Когда вы добавляете:

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

в определении бина это сообщает WebLogic, какую роль следует применять к любым вызовам в этом бине, которые он инициирует сам, а не к тому, что инициирует пользователь.

т.е. этот идентификатор безопасности будет применяться к методам таймера EJB и onMessage метод MDB (и если я правильно помню, некоторые хозяйственные операции).

Расширение WebLogic с <run-as-role-assignment>...</run-as-role-assignment> Элемент добавляет определенный принципал к этим вызовам методов, так что javax.ejb.EJBContext.getCallerPrincipal() возвращает что-то отличное от anonymous во время одного из этих вызовов метода.

Во всех других случаях эта информация о безопасности обычно передается из личности вошедшего в систему пользователя веб-приложения.

Обычно пользователь проходит аутентификацию через веб-приложение на основе сервлета, которое подключено к домену безопасности, предоставленному сервером приложений. Затем контейнер сервлета будет связывать входящие HTTP-запросы с принципалом пользователя. Этот пользовательский принципал должен быть связан с одной или несколькими "ролями", прежде чем может быть выполнен доступ на основе ролей (который выполняется способом, зависящим от поставщика, но часто связан с JAAS). Если у пользователя нет ролей, контейнер отклонит любую попытку вызвать сервлеты или нижестоящие EJB-компоненты, которые были защищены объявлениями ролей безопасности в дескрипторах развертывания или соответствующими аннотациями http://docs.oracle.com/javaee/7/api/javax/annotation/security/RolesAllowed.html. Контекст безопасности, установленный контейнером сервлета, распространяется через последующую цепочку вызовов EJB до тех пор, пока он не будет успешно возвращен или заблокирован ролью безопасности.

Для получения дополнительной информации, пожалуйста, обратитесь к разделам "Безопасность" Спецификации сервлета и Спецификации EJB.

Другие вопросы по тегам