0

我不确定这实际上是一个真正的问题还是一个愚蠢的初学者问题。也许我错过了一些观点,这个问题相当琐碎,所以请多多包涵。

如果我猜对了,那么层和层之间的区别在于层与逻辑分离有关,而层则意味着应用程序部分的物理分离。

可以将层实现为单独的层,以保护应用程序免受用户直接调用(例如,对数据访问对象)的影响。但我的意图是以逻辑方式向用户客户端隐藏应用程序的较低层,这意味着实际上不使用单独的 jvm 或应用程序服务器。我该怎么做,这是否与包装的方式有关?(不同的档案,如 jar、war、ears 以隔离逻辑......)。

我实际上对为分层服务器应用程序提供安全性很感兴趣,因为它可能存在各种不受我控制的客户端。如果我要为客户端应用程序程序员提供高级服务的接口,我也必须使用 EJB 安全注释来保护低层。我希望通过将较低层标记为应用程序客户端无法访问来以更优雅的方式执行此操作。

4

1 回答 1

2

但我的意图是以逻辑方式向用户客户端隐藏应用程序的较低层,这意味着实际上不使用单独的 jvm 或应用程序服务器。

如果这些“用户客户端”在同一个 JVM 甚至同一个应用程序(例如同一个 .war、同一个 .ear)中运行,那么您所寻求的安全级别只是表面的。基本上,你是在保护你自己的同事或队友(通常,“用户客户端”是外部客户端,从不同的机器上运行,通过 Internet 与你联系)。

在 Java EE EAR 应用程序中存在一些分层,但这些层的存在是为了防止业务逻辑直接访问视图逻辑。例如,较低级别的层不能访问较高级别的层。这些层通过类加载器隔离相互保护。具体来说,每个 Web 模块都位于层次结构的底部,其他模块(甚至不是其他 Web 模块)无法直接访问其中的代码。EJB 模块是向下的一层,所有 Web 模块以及其他 EJB 模块都可以访问其中的代码。最后是顶层 EAR,它不算作一个模块,但可以包含实用程序代码,这些代码不能直接访问模块中的代码,但可以被所有模块使用(因此是跨层的,Web 模块)也可以直接访问)。

Java EE 中的模块系统似乎与您想要的不同。它隐藏了更高的层,而不是更低的层。

通过将多个“协作”应用程序部署到同一个应用程序服务器,可以实现额外级别的模块隔离。然后,您可以将 EJB bean 的远程接口定义为您试图隐藏的逻辑的网关(外观)。请注意,许多应用程序服务器也允许部署到同一 AS 的其他应用程序从 JNDI 请求本地 EJB,即使 EJB 规范不要求这样做(但也没有禁止)。

此外,还有私有和受保护访问修饰符的常用机制,但这些更适合保护您免受编码错误的影响。反射技巧很容易通过它们。

然后是安全经理。如果您不信任来自您自己的队友(“用户客户端”)的代码,您可能需要考虑使用这些代码。它们的使用可能具有挑战性,但可能正是您想要的。

于 2012-12-20T17:10:47.483 回答