Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Security 从servlet调用具有Seam安全性的SLSB_Security_Session_Servlets_Ejb 3.0_Seam - Fatal编程技术网

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

Security 从servlet调用具有Seam安全性的SLSB,security,session,servlets,ejb-3.0,seam,Security,Session,Servlets,Ejb 3.0,Seam,我有一个用SEAM编写的现有应用程序,它使用SEAM Security()。在无状态EJB中,我可能会发现如下内容: @In Identity identity; ... if(identity.hasRole("admin")) throw new AuthException(); 据我所知,Seam从调用EJB的servlet的SessionContext中注入Identity对象(这种情况发生在“幕后”,因为Seam实际上并不使用servlet),并在调用后将其删除。这是正确的

我有一个用SEAM编写的现有应用程序,它使用SEAM Security()。在无状态EJB中,我可能会发现如下内容:

@In
Identity identity;

... 

if(identity.hasRole("admin"))
  throw new AuthException();
据我所知,Seam从调用EJB的servlet的SessionContext中注入Identity对象(这种情况发生在“幕后”,因为Seam实际上并不使用servlet),并在调用后将其删除。这是正确的吗

现在是否可以从另一个servlet访问此EJB(在本例中,该servlet是GWT应用程序的服务器端)?我是否必须“注入”正确的标识实例?如果我什么也不做,Seam会注入一个实例,但不会正确关联会话和Identity实例(因此会话之间共享Identity实例,有时调用get new instances等)

欢迎任何帮助和指点-谢谢


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

你的问题令人难以置信地难以理解,我不确定我是否理解了所有的事情。无论如何,我假设您使用的是无状态会话bean(因为您说过我可以使用有状态bean),根据定义,它是无状态的。那么,在调用一个无状态会话bean之后,如何才能将Mary认证为Joe呢?这不可能,这没有任何意义

PS:您可能应该重新表述您的问题,并尝试清楚地区分HTTP会话、会话bean(无状态、有状态?)、
SessionContext
等概念

Seam从调用EJB的servlet的SessionContext注入标识对象,并在调用后将其删除。这是正确的吗

是的,但不要忘记您必须启用EJB Seam拦截器,看看如何

现在可以从另一个servlet访问任何EJB了吗

是的,您可以使用它的全局JNDI(依赖于供应商)来检索它。查看如何设置和检索EJB@State less/ful bean。如果您有一个完全受支持的Java EE应用服务器,您可以通过注释来检索它

我是否必须“注入”正确的标识实例

你不必为此担心。seamejb拦截器负责处理它。去吧

更新

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

标识组件本身并没有实现equals方法,默认情况下,该方法通过使用equals比较(=)来使用默认的equals实现。我不知道对于每个EJB调用,您是否总是有一个新的标识组件(也许这解释了为什么您有“两个不同的实例”)

如果Servlet的共享相同的上下文,则可以启用IdentityFilter,作为使用方法包装身份分配角色的一种方式。它的功能如下:

提供Servlet安全性和Seam标识组件之间集成的过滤器。这种集成是通过使用HttpServletRequestWrapper实现来完成的,HttpServletRequestWrapper实现将安全相关的调用委托给Seam标识组件

如果使用@Identity组件,默认情况下将启用该组件

因此,不要注入EJB(及其@injected@Identity)并使用

你可以用

request.hasUserInRole("admin");
也许你想看看

更多


ContextFilter(默认情况下未启用)向非JSF servlet(如Struts、SpringMVC和DirectWebRemoting(DWR))打开对Seam容器及其上下文变量的访问。我不知道如何使用这种函数性。

你好,帕斯卡,thx-试图简化这个问题。是的,使用了SLSB(我在第一句中暗示了这一点)。我猜状态是由Seam在会话上下文中管理的,在调用slsb时注入和退出slsb。错了吗?如果我误用了任何概念,请让我知道:-)您回复的thx-已配置EJBSeam拦截器,我正在使用JNDI检索实例。到目前为止还可以,但我面临着一些问题。示例:登录(调用到servlet、EJB,注入标识实例并用于身份验证)。然后用户快速连续调用两个服务。在servlet中,两个调用都在同一个会话中结束(我使用SessionID进行了检查),但在EJB中,注入了两个不同的Identity实例。我猜Seam使用的会话上下文没有正确链接到servlet的会话上下文?有什么想法吗?
request.hasUserInRole("admin");