如何才能使用户可以访问您的应用程序数据,又不会将您的实体 bean 直接暴露给 Web 层,从而不会使您的应用程序面临安全性威胁?Brett McLaughlin 提供了一个解决方案,它可使您的实体 bean 很安全,并且使您的整个应用程序有效率地运行。
Enterprise JavaBeans 技术一般分成三种核心类型的 bean:会话 bean、消息驱动 bean 和实体 bean。bean 还可以分成充当业务对象的 bean 和充当数据对象的 bean。会话 bean 和消息驱动 bean 是业务对象;实体 bean 是数据对象。大多数情况下,只需要将业务对象暴露给 Web 层(有时称为应用层),因为业务对象可以使用数据对象来处理数据存储。但在有些情况下,有必要答应用户直接访问和操作数据对象,这意味着要将实体 bean 暴露给 Web 层。这会使您的应用程序面临安全性威胁,而且随着您的应用程序的发展,还会导致杂乱无章的代码。
在这篇EJB最佳实践的文章中,我们将讨论为什么绝对不可以将实体 bean 暴露给应用程序的 Web 层,以及为什么这是难以避免的。接着我将向您演示一个变通方法,它既能使您的实体 bean 更安全,又能使您的整个应用程序更有效率。
暴露的风险
实体bean揭示了大量有关数据库底层结构的信息。因为每个bean都包含用于数据库中的各个字段的取值(Accessor)和赋值(mutator)方法(即,getxxx() 和 setxxx()),而且因为方法名称通常与字段名称连在一起(User bean 中的 getFirstName() 通常访问 Users表中的firstName字段),所以从应用程序的实体bean推断这个应用程序的整个数据库结构是可能的。尽管在单个应用程序中这可能不是什么大问题,但您的bean经常会暴露给其它网络上另外的应用程序。在 Web 服务系统中尤其会发生这种情况,其中应用程序都是跨多个网络链接的。
暴露的 bean:一个工作示例