【问题标题】:Is there a Delphi equivalent to Java's PermissionManager or AccessController classes?是否有与 Java 的 PermissionManager 或 AccessController 类等效的 Delphi?
【发布时间】:2012-03-05 09:06:03
【问题描述】:

是否有任何类(免费、开源或商业)执行类似于 Java 的 AccessController 所做的访问控制?我想创建一组可以在运行时更改的动态策略。

但是,我想避免编写代码

if Allowed( ... ) then

到处都是。我知道我可能需要调整我的程序类层次结构,但我更喜欢这样做,而不是在所有地方手动添加警卫。

如果没有现成的代码,那么明智的做法是什么? RTTI?

编辑:这是来自Security Annotations and Authorization in GlassFish and the Java EE 5 SDK 文章的示例。由于有人在评论中提到了注释,我认为这是理想的:

@Stateless
@RolesAllowed("javaee")
public class HelloEJB implements Hello {
    @PermitAll
    public String hello(String msg) {
        return "Hello, " + msg;
    }

    public String bye(String msg) {
        return "Bye, " + msg;
    }
}

来自文章:

在本例中,hello() 方法可供所有人访问,而 bye() 方法可供角色 javaee 的用户访问。

编辑: 好吧,似乎普遍的共识是这不能在 Delphi 中完成。其他人认为这是一种不好的方法。

我,我仍然认为这会很棒。我在 Java 中的注释(作为图腾柱中的代码猴子)的经验是积极的。添加一个新方法,添加某种形式的注释(与 Java 安全注释不完全相同),然后就完成了。管理员稍后可以转到管理面板并将对该新处理程序的授予访问权限添加到组或个人用户。它只是工作。

这些是我目前的选择:

  1. TMS Security System - 这似乎是一个完整的解决方案,包含多个工具。值得研究。我接受这个作为答案,即使我可能不会这样做。
  2. 这看起来很有希望:Delphi virtual method interception。它只适用于虚拟方法,但我认为这并不难遵守。这和注释可以组成一个有趣的系统(看起来这最初是为 DataSnap 身份验证而设计的)
  3. 在您的应用程序中只有一个 ActionManager,并确保所有操作只能从那里启动。这样就可以使用动作管理器OnExecute 方法;我假装使用TAction.Name 属性作为权限名称(“处理程序”),从表中读取允许操作的列表。我可以使用操作管理器中的操作列表在管理 UI 中显示整个列表。

【问题讨论】:

  • 我认为你可以通过使用属性来实现类似的功能(如果我错了,请不要把我钉在十字架上......)这里有几个链接:robstechcorner.blogspot.com/2009/09/…delphi.about.com/od/oopindelphi/a/…stackoverflow.com/questions/2657502/…
  • @DorinDuminica - 可以收集注释并将其放入列表中以便我可以将它们分配给特定角色吗?
  • 你能提供一些关于 Delphi 代码应该是什么样子的示例代码吗?你说你不想做 if Allowed(...) then,但链接文档中的第一个 Java 示例是 inheritedContext.checkPermission(permission); - 这在我的书中大致相同。
  • @CosminPrund - 我用一个例子编辑了我的问题。

标签: delphi delphi-xe


【解决方案1】:

是的,有一个 Delphi Access Control Library (lkacl)(开源)、JCL(开源)提供了相当全面的安全性features,最后,如果您的要求非常高,最流行的商业解决方案是TMS Security System .

【讨论】:

  • 这是一个“让我为你谷歌”的答案。第一个链接的项目尚未发布任何文件,您链接的features 主要指定使用 WINDOWS 安全令牌的函数。最后一个链接(TMS安全系统)看起来不错,你用过吗?
  • 我想我在这方面并不清楚。我不是在寻找 ACL 包装器;例如,我不希望我的用户需要管理员权限才能在我的应用程序中查看销售报告。
  • 我实际上认为 TMS 链接是一个很好的答案。它没有使用 Fancy Flavor Java 注入模式,但它可能比尝试用“魔术”解决问题要好。 +1。
  • 和 jwscl 似乎是独立的 JediAPI 相关项目,而不是 JCL 的 oart :-)
【解决方案2】:

目前还没有这样的 Delphi 框架,也没有适合它的 EJB 等概念。 DELPHI 确实支持类注释,并且可以设计这样的框架,可能与 TAction 结合使用,以提供操作级别的安全性,但我怀疑这可以扩展到阻止特定的方法调用。 Delphi 代码从不请求调用虚拟方法的权限。任何将自己注入到 Delphi 中的每个虚拟方法调用中的任何东西,在幕后添加一个 checkPermission 调用都会(在我看来)是邪恶的。这会很慢,而且比手写这样的支票还要糟糕。

但是,用于模拟 delphi 类的相同技术将来可能会用于创建一些自动安全包装器对象。

我猜如果所讨论的 Java 库使用了 Aspects(本质上是通过代码挂钩等技术实现的“注入”),那么它就不需要到处调用“CheckAllowed”。如果您不介意将所有方法调用更改为实现接口,然后提供执行方法调用的包装器,并在其周围使用某种自动生成的模拟安全包装器,则可以避免调用 CheckAllowed。

因此,一个受保护的否,带有“未来可能的有限框架”子句。

【讨论】:

  • 我认为手动 CheckPermission 调用将是必要的。如果您考虑一下,无论如何,必须将 TAction.Enable 设置为启用或禁用,对吗?通常 acSaveFile.Enabled 将设置为“FileOpen and FileModified and PermissionToSave”。因此,在现实世界中,“自动”工作的许可框架会很糟糕。 99% 的解决方案,开销巨大。
  • 可能重载SetEnable 足以满足大多数情况。我的应用程序可以转到if FileModified then acSave.Enabled := true,但权限管理器仍然可以决定不启用该操作。至少在一段时间内就足够了。
  • 我以前也曾走这条路,在我看来,显式调用更好。聪明是一个菜鸟的解决方案。去明确的电话。
  • 也许你是对的。但是 Java 中的安全注释确实有效(我目前参与了一个大型项目,其中有很多开发人员分散在全球各地,这已被证明是一种绝妙的方法。)
  • +1,尤其是 Warren 的评论 "Cleverness is a rookie solution. Go for explicit calls."。我在自己的应用程序中实现了类似类型的安全性:我的受保护方法的第一行通常是这样的:if not SecurityAllowes(Value) then Exit;。一旦你开始输入这些,这没什么大不了的。您可能没有那么多方法可以保护,而且保护也不需要那么复杂。
猜你喜欢
  • 2021-05-26
  • 2013-07-25
  • 1970-01-01
  • 2010-10-04
  • 1970-01-01
  • 2011-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多