Delphi是否等同于Java的PermissionManager或AccessController类?

时间:2012-02-13 23:08:10

标签: delphi delphi-xe

是否有任何类(免费,开源或商业)执行类似于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()方法,角色javaee的用户可以访问bye()方法。

修改 好吧,似乎普遍的共识是,这不能在Delphi中完成。其他人认为这是一个糟糕的方法。

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

这些是我目前的选择:

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

2 个答案:

答案 0 :(得分:2)

Delphi还没有这样的框架,也没有类似EJB的概念。 DELPHI确实支持类注释,并且可以设计这样的框架,可能与TAction一起提供动作级别的安全性,但我怀疑这可以扩展到阻止特定的方法调用。 Delphi代码永远不会要求权限来调用虚方法。任何在Delphi中注入每个虚拟方法调用的东西,在幕后添加一个checkPermission调用(在我看来)都是邪恶的。这将是缓慢的,而且比手工编写这样的检查更糟糕。

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

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

这是一个守卫的No,具有“未来可能的有限框架”条款。

答案 1 :(得分:1)

是的,有一个Delphi Access Control Library (lkacl)(OpenSource),JCL(OpenSource)提供了一个非常全面的安全性features,最后如果你的需求真的很高,最受欢迎商业解决方案是TMS Security System