【问题标题】:How to filter requests in EJB based web applications?如何过滤基于 EJB 的 Web 应用程序中的请求?
【发布时间】:2013-11-14 12:43:47
【问题描述】:

我们有一个 Web 应用程序,我们在其中使用 LDAP 领域对用户进行身份验证。然后我们必须检查经过身份验证的用户是否有权限打开我们的应用程序。

我们的应用程序中有很多应用程序/模块。所有客户凭证都存储在 LDAP 服务器中。但是客户将无法访问每个应用程序。他们将购买并获得使用/访问该应用程序的权利。

所以我建议使用 servlet api 中的过滤器来做授权部分。

我们正在使用 EJB 3.0 来开发我们的服务组件和其他组件。在 EJB 层上,我们有一个 REST 层,这意味着每个人都必须从 Web 服务访问 EJB。 EJB 中是否有任何组件将在访问 EJB 之前执行,或者 REST 中是否有任何组件提供相同的功能?

在这种情况下使用 servlet 过滤器是否正确?或者有没有更好的方法?

提前谢谢大家。美好的一天。

【问题讨论】:

    标签: jakarta-ee


    【解决方案1】:

    我的建议是保护必须保护的东西:业务逻辑的实现。业务逻辑驻留在 EJB 中,所以我的第一个选择是保护这一层。

    为什么?

    总有一天会有人通过另一个渠道公开业务逻辑;可能是其他一些应用程序需要通过 RMI 访问 EJB;或作为 SOAP Web 服务;管他呢。如果在 Web 层实现安全性,则其他应用程序将可以不受限制地访问逻辑,除非它有实现安全性的良好意愿。

    如何?

    我想到了几件事。

    1. 最简单的解决方案是将使用特定模块的权限映射到角色。当用户为该模块付费时,他/她被分配了该角色。 EJB 方法将受到保护,以允许适当的角色集访问它们。示例代码:

      @Stateless
      public class ModuleOneBean implements ModuleOne
      {
          @Resource SessionContext ctx;
      
          public void businessMethod() {
              if( !ctx.isCallerInRole("moduleOneRole") ) {
                  throw new SecurityException(...);
              }
      
              // business logic as usual
              ...
          }
      }
      
    2. 如果授权逻辑比这更复杂,EJB 拦截器可能会很有用。它们类似于 servlet 过滤器,但用于 EJB 层。基于拦截器的安全基础设施的智能实现可以处理比以前的解决方案更多的情况,包括基于角色的授权的情况。一个简化的用法,粗略地用拦截器实现前面的例子是:

      @Stateless
      public class ModuleOneBean implements ModuleOne
      {
          @Interceptors(ModuleOneSecurityInterceptor.class)
          public void businessMethod() {
              // business logic as usual
              ...
          }
      }
      

      和:

      public class ModuleOneSecurityInterceptor
      {
          @Resource SessionContext ctx;
      
          @AroundInvoke
          public Object authorize(InvocationContext invctx) {
              if( !ctx.isCallerInRole("moduleOneRole") ) {
                  throw new SecurityException(...);
              }
              return ctx.proceed();
          }
      }
      

      注意:拦截器也可以在ejb-jar.xml 中声明(@Interceptors 注释不是必需的),以免增加代码负担保持控制集中,尤其是为了安全。

    3. 自定义解决方案(例如,this 使用 CDI)。


    如果您非常确定 Web 应用程序将永远是访问核心的唯一方式,那么 servlet 过滤器可能就可以了。无论如何,您可能需要为 Web 应用添加额外的保护层。

    【讨论】:

    • 您好 Nikos,感谢您的快速回复。我想使用 EJB 拦截器。第一种方法,我必须在所有业务方法中编写if代码。其次,我想说我们的应用程序只能通过 Web 层访问。但出于与您解释的相同原因,我会考虑使用拦截器方法。
    • 确实,第一种方法有这个严重的缺点。相反,您可以在部署描述符中添加拦截器,而不涉及现有代码。
    猜你喜欢
    • 2011-04-07
    • 2012-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-06
    • 2020-12-05
    • 2011-05-17
    相关资源
    最近更新 更多