从servlet调用具有Seam安全性的SLSB

时间:2010-06-06 10:26:53

标签: security session servlets ejb-3.0 seam

我有一个用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从调用EJB的servlet的SessionContext中注入Identity对象(这种情况发生在“幕后”,因为Seam并不真正使用servlet)并在调用后将其删除。这是对的吗?

现在是否可以从另一个servlet访问此EJB(在这种情况下,该servlet是GWT应用程序的服务器端)?我是否必须“注入”正确的Identity实例?如果我什么都不做,Seam会注入一个实例,但是没有正确地关联Identity的会话和实例(因此Identity的实例在会话之间共享,有时会调用获取新实例等。)

非常欢迎任何帮助和指示 - 谢谢!

技术:EJB3,Seam 2.1.2。 servlet实际上是GWT应用程序的服务器端,尽管我认为这不重要。我正在使用JBoss 5.

2 个答案:

答案 0 :(得分:2)

  

Seam从调用EJB的servlet的SessionContext中注入Identity对象,并在调用后将其删除。这是对的吗?

是的,但不要忘记你必须启用EJB Seam拦截器请参阅here如何

...

  

现在是否可以从另一个servlet访问任何EJB

是的,您可以使用其全局JNDI(依赖于供应商)来检索它。请参阅here如何设置和检索EJB @State less / ful bean。如果您拥有完全支持的Java EE应用服务器,则可以通过注释进行检索。

  

我是否必须“注入”正确的Identity实例?

你不必担心它。 Seam EJB拦截器负责处理它。来吧。

<强>更新

  

但是在EJB中,注入了两个不同的Identity实例。我猜Seam正在使用的Session上下文没有正确链接到servlet的Session上下文?有什么想法吗?

嗯,Identity组件本身并没有实现equals方法,默认情况下,equals方法使用equals comparison(==)来使用default equals implementation。我不知道,对于每个EJB调用,您是否总是有一个新的Identity组件(也许它解释了为什么你有“两个不同的实例”)

如果您的Servlet的共享相同的上下文,您可以启用IdentityFilter作为使用isUserInRole方法包装您的Identity分配角色的方法。这是它的功能:

  

提供Servlet安全性和Seam标识组件之间集成的过滤器。这种集成是通过将HttpServletRequest与HttpServletRequestWrapper实现包装在一起来实现的,该实现将与安全相关的调用委托给Seam身份组件

如果使用@Identity组件,则默认启用

所以不要注入你的EJB(以及它的@In-jected @Identity)并使用

identity.hasRole("admin");

您可以使用

request.hasUserInRole("admin");

也许你想看到Setting and reading the Conversation IDSeam and GWT

更多

ContextFilter(默认情况下未启用)打开对Seam容器及其上下文变量的访问,以访问非JSF servlet,例如Struts,Spring MVC和Direct Web Remoting(DWR)。我不知道如何使用这种功能。

答案 1 :(得分:0)

你的问题非常难以理解,我不确定我是否了解所有内容。无论如何,我假设您正在使用无状态会话Bean(因为您说我可以使用有状态bean ),根据定义,它们是无状态的。那么在调用无状态会话bean之后,Mary如何才能被认证为Joe?这不可能,它没有任何意义。

PS:您应该重新解释一下您的问题并尝试清楚地区分HTTP会话,会话Bean(无状态,有状态?),SessionContext等概念。