我有一个用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.
答案 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 ID和Seam and GWT
更多
ContextFilter(默认情况下未启用)打开对Seam容器及其上下文变量的访问,以访问非JSF servlet,例如Struts,Spring MVC和Direct Web Remoting(DWR)。我不知道如何使用这种功能。
答案 1 :(得分:0)
你的问题非常难以理解,我不确定我是否了解所有内容。无论如何,我假设您正在使用无状态会话Bean(因为您说我可以使用有状态bean ),根据定义,它们是无状态的。那么在调用无状态会话bean之后,Mary如何才能被认证为Joe?这不可能,它没有任何意义。
PS:您应该重新解释一下您的问题并尝试清楚地区分HTTP会话,会话Bean(无状态,有状态?),SessionContext
等概念。