Мне записали существующее приложение во ШВЕ, который использует безопасность ШВА (http://docs.jboss.org/seam/2.1.1.GA/reference/en-US/html/security.html). В EJB не сохраняющем состояние я мог бы найти что-то вроде этого:
@In
Identity identity;
...
if(identity.hasRole("admin"))
throw new AuthException();
Насколько я понимаю, Шов вводит объект Идентификационных данных от SessionContext сервлета, который вызывает EJB (это происходит "негласно", так как Шов действительно не использует сервлеты), и удаляет его после вызова. Это корректно?
Теперь возможно получить доступ к этому EJB от другого сервлета (в этом случае, тот сервлет является стороной сервера приложения GWT)? Я должен "ввести" корректный экземпляр Идентификационных данных? Если я ничего не делаю, Шов вводит экземпляр, но правильно не коррелирует сессии и экземпляры Идентификационных данных (таким образом, экземпляры Идентификационных данных совместно используются сессиями, и иногда звонит, получают новые экземпляры и т.д.).
Любая справка и указатели очень приветствуются - Спасибо!
Технология: EJB3, Шов 2.1.2. Сервлеты являются на самом деле серверной стороной приложения GWT, хотя я не думаю, что это имеет значение очень. Я использую JBoss 5.
Ваш вопрос невероятно трудный для понимания, и я не уверен, что все понял. В любом случае, я предполагаю, что вы используете сеансовые компоненты без сохранения состояния (поскольку вы сказали , что я мог бы использовать компоненты с отслеживанием состояния ), которые по определению не имеют состояния. Так как же Мэри может пройти аутентификацию как Джо после вызова сессионного компонента без сохранения состояния ? Этого не может быть, в этом нет никакого смысла.
PS: Возможно, вам стоит перефразировать свой вопрос и попытаться четко различать такие понятия, как HTTP-сеанс, Session Beans (без отслеживания состояния, с отслеживанием состояния?), SessionContext
.
Seam инжектирует объект Identity из SessionContext сервлета, который вызывает EJB, и удаляет его после вызова. Правильно ли это?
Да, но не забывайте, что вы должны включить перехватчик EJB Seam Смотрите здесь как
...
Можно ли теперь получить доступ к ЛЮБОМУ EJB из другого сервлета
Да, вы можете использовать его глобальный JNDI (зависит от поставщика), чтобы получить его. Смотрите здесь, как вы можете настроить и получить ваш EJB @State less / ful bean. Если у вас есть полностьюподдерживаемый сервер приложений Java EE, вы можете получить его с помощью аннотаций.
Нужно ли мне "инжектировать" правильный экземпляр Identity?
Вам не нужно об этом беспокоиться. Seam EJB interceptor позаботится об этом. Продолжайте.
UPDATE
но в EJB инжектируются два разных экземпляра Identity. Я предполагаю, что контекст сессии, который использует Seam, неправильно связан с контекстом сессии сервлета? Есть идеи ?
Ну, сам компонент Identity не реализует метод equals, который, по умолчанию, использует реализацию equals по умолчанию, используя сравнение equals (==). Я не знаю, всегда ли для каждого вызова EJB у вас есть свежий компонент Identity (возможно, это объясняет, почему у вас есть "два разных экземпляра")
Если ваши сервлеты разделяют один и тот же контекст, вы можете включить IdentityFilter как способ обернуть назначенную Identity роль, используя метод isUserInRole. Вот его функциональность:
Фильтр, который обеспечивает интеграцию между Servlet Security и компонентом идентификации Seam. Эта интеграция достигается путем обертывания HttpServletRequest реализацией HttpServletRequestWrapper который делегирует связанные с безопасностью вызовы компоненту Seam identity .
Если использовать компонент @Identity, он включен по умолчанию
Поэтому вместо того, чтобы инжектировать свой EJB (и его @In-jected @Identity) и использовать
identity.hasRole("admin");
Вы можете использовать
request.hasUserInRole("admin");
И, возможно, вы захотите посмотреть Установка и чтение идентификатора разговора И Seam и GWT
Еще
Контекстный фильтр (не включен по умолчанию) открывает доступ к контейнеру Seam и его контекстным переменным для сервлетов, не относящихся к JSF, таким как Struts, Spring MVC и Direct Web Remoting (DWR). Я не знаю, как использовать этот вид функциональности.