Вызов SLSB с защитой шва из сервлета - PullRequest
1 голос
/ 06 июня 2010

У меня есть приложение, написанное на SEAM, которое использует SEAM Security (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();

Насколько я понимаю, Seam внедряет объект Identity из SessionContext сервлета, который вызывает EJB (это происходит "за кулисами", поскольку Seam на самом деле не использует сервлеты), и удаляет его после вызова. Это правильно?

Возможно ли теперь получить доступ к этому EJB из другого сервлета (в этом случае этот сервлет является серверной стороной приложения GWT)? Нужно ли вводить правильный экземпляр удостоверения? Если я ничего не делаю, Seam внедряет экземпляр, но неправильно соотносит сеансы и экземпляры Identity (поэтому экземпляры Identity распределяются между сеансами, а иногда вызовы получают новые экземпляры и т. Д.).

Любая помощь и указатели очень приветствуются - спасибо!

Технология: EJB3, шов 2.1.2. Сервлеты на самом деле являются серверной частью приложения GWT, хотя я не думаю, что это имеет большое значение. Я использую JBoss 5.

Ответы [ 2 ]

2 голосов
/ 07 июня 2010

Seam внедряет объект Identity из SessionContext сервлета, который вызывает EJB и удаляет его после вызова. Это правильно?

Да, но не забывайте, что вы должны включить EJB Перехватчик швов. См. здесь как

...

Теперь можно получить доступ к ЛЮБОМ EJB из другого сервлета

Да, вы можете использовать его Global JNDI (зависит от поставщика), чтобы получить его. Смотрите здесь , как вы можете настроить и получить ваш EJB @State less / ful bean. Если у вас есть сервер приложений Java EE с поддержкой полностью , вы можете получить его с помощью аннотаций.

Нужно ли "вводить" правильный экземпляр Identity?

Вам не нужно об этом беспокоиться. Шов EJB перехватчик позаботится об этом. Вперед.

UPDATE

но в EJB вводятся два разных экземпляра идентичности. Я предполагаю, что контекст сеанса, который использует Seam, неправильно связан с контекстом сеанса сервлета? Есть идеи?

Ну, сам компонент Identity не реализует метод equals, который по умолчанию использует реализацию equals по умолчанию с использованием сравнения equals (==). Я не знаю, есть ли для каждого вызова EJB всегда новый компонент Identity (возможно, это объясняет, почему у вас есть «Два разных экземпляра»)

Если ваш сервлет совместно использует тот же контекст , вы можете включить IdentityFilter как способ обернуть вашу роль, назначенную для идентификации, используя isUserInRole метод. Вот его функциональность:

Фильтр, который обеспечивает интеграцию между Servlet Security и компонентом идентификации Seam. Эта интеграция достигается путем обертывания HttpServletRequest с реализацией HttpServletRequestWrapper , которая делегирует связанные с безопасностью вызовы компоненту идентификации Seam .

Если используется компонент @Identity, он включен по умолчанию

Так что вместо того, чтобы вводить свой EJB (и его @ In-jected @Identity) и использовать

identity.hasRole("admin");

Вы можете использовать

request.hasUserInRole("admin");

А может быть, вы хотите увидеть Установка и чтение идентификатора разговора И Шов и GWT

Подробнее

ContextFilter (по умолчанию не включен) открывает доступ к контейнеру Seam и его переменным контекста для не сервлетов JSF, таких как Struts, Spring MVC и Direct Web Remoting (DWR). Я не знаю, как использовать эту функцию.

0 голосов
/ 06 июня 2010

Твой вопрос невероятно сложен, и я не уверен, что все понял.В любом случае, я предполагаю, что вы используете сессионные компоненты без состояния (так как вы сказали я мог бы использовать компоненты с сохранением состояния ), которые по определению не имеют состояния.Итак, как Мэри может пройти аутентификацию как Джо после вызова сеанса без состояния сессионного компонента?Этого не может быть, это не имеет никакого смысла.

PS: Возможно, вам следует перефразировать ваш вопрос и попытаться четко различить такие понятия, как HTTP-сеанс, сессионные компоненты (без состояний, с состоянием?), SessionContext.

...