Настройка безопасности 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-name>
<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.