1

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

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

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

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

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

谢谢大家。再会。

4

1 回答 1

3

我的建议是保护必须保护的东西:业务逻辑的实现。业务逻辑驻留在 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. 定制解决方案(例如使用 CDI)。


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

于 2013-11-14T13:34:33.777 回答