【问题标题】:Calling a SLSB with Seam security from a servlet从 servlet 调用具有 Seam 安全性的 SLSB
【发布时间】:2011-02-28 08:34:28
【问题描述】:

我有一个用 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 应用程序的服务器端)?我是否必须“注入”正确的身份实例?如果我什么都不做,Seam 会注入一个实例,但不会正确关联会话和 Identity 实例(因此 Identity 实例在会话之间共享,有时调用获取新实例等)。

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

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

【问题讨论】:

    标签: security session servlets ejb-3.0 seam


    【解决方案1】:

    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 实现。我不知道,对于每个 EJB 调用,你是否总是有一个新的身份组件(也许它解释了为什么你有“两个不同的实例”)

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

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

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

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

    identity.hasRole("admin");
    

    你可以使用

    request.hasUserInRole("admin");
    

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

    更多

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

    【讨论】:

    • 感谢您的回复 - EJB Seam 拦截器已配置,我正在使用 JNDI 检索实例。到目前为止它有效,但我遇到了问题。示例:登录(调用到 servlet,到 EJB,Identity 实例被注入并用于身份验证)。然后用户快速连续调用两个服务。在 servlet 中,两个调用最终都在同一个会话中(我使用 SessionID 检查),但在 EJB 中,注入了两个不同的 Identity 实例。我猜 Seam 使用的 Session 上下文没有正确链接到 servlet 的 Session 上下文?有什么想法吗?
    【解决方案2】:

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

    PS:您或许应该重新表述您的问题并尝试清楚地区分概念,例如 HTTP 会话、会话 Bean(无状态、有状态?)、SessionContext

    【讨论】:

    • 你好 Pascal,谢谢 - 试图简化问题。是的,使用了 SLSB(我在第一句话中暗示了这一点)。我猜想状态是由 Seam 在会话上下文中管理的,并在 SLSB 被调用时注入和退出。错误的?如果我滥用了任何概念,请告诉我:-)
    猜你喜欢
    • 2014-07-03
    • 1970-01-01
    • 2019-09-14
    • 1970-01-01
    • 2017-07-08
    • 2011-02-12
    • 1970-01-01
    • 2011-05-17
    • 1970-01-01
    相关资源
    最近更新 更多