Architecture 操作、权限和体系结构

Architecture 操作、权限和体系结构,architecture,permissions,action,Architecture,Permissions,Action,在我的逻辑层中,我需要检查各种操作的权限。有些动作是通用的,但有些动作是高度专业化的。每个操作都有一个相应的权限层次结构,在执行该操作之前对其进行评估。我脑子里一直在思考架构的想法,但还没有形成一个我认为可以扩展、简单和优雅的坚实的想法 当前代码如下所示: public class LogicObject { public void Add() { Check Add Permission Perform

在我的逻辑层中,我需要检查各种操作的权限。有些动作是通用的,但有些动作是高度专业化的。每个操作都有一个相应的权限层次结构,在执行该操作之前对其进行评估。我脑子里一直在思考架构的想法,但还没有形成一个我认为可以扩展、简单和优雅的坚实的想法

当前代码如下所示:

public class LogicObject
{
       public void Add()
       {
            Check Add Permission
            Perform
       }
       public void Update()
       {
            Check Update Permission
            Perform
       }
}
public class AddAction : IAction
{
   public bool IsPermitted;
   public void Perform();
}

public class LogicObject
{
   public IAction AddAction {get { return new AddAction(); } }
}
这种体系结构的问题是,首先,它实际上没有那么好的可扩展性,其次,它不允许我在不执行操作的情况下检查权限

我的另一个想法是有这样的东西:

public class LogicObject
{
       public void Add()
       {
            Check Add Permission
            Perform
       }
       public void Update()
       {
            Check Update Permission
            Perform
       }
}
public class AddAction : IAction
{
   public bool IsPermitted;
   public void Perform();
}

public class LogicObject
{
   public IAction AddAction {get { return new AddAction(); } }
}

我更喜欢这种架构,但我对它不太感兴趣。这似乎有点愚蠢。我无法想象这种建筑是独一无二的。更好的方法有哪些?

另一种选择是使用面向方面的编程,让服务外部的组件控制方法访问授权。它的基本意思是,您的方法将在运行时由执行授权的代码包装

java实现此功能的一个示例解决方案是,它将为您提供多种自定义和定义授权方案的方法。 然后,对象将看起来像:

public class logicObject {
     @PreAuthorize("hasRole('ROLE_USER')")
           public void update() {
                //Perform
           }

     //...
    }
public class LogicObject
{
    [PrincipalPermissionAttribute(SecurityAction.Demand, Role="ROLE_USER")]
       public void Add()
       {
            //Perform
       }

}
当然,您需要额外的代码来定义安全上下文,并使用该上下文为logicObject类创建代理,同时定义授权本身

由于您给出的代码示例似乎是用C编写的,因此您可能希望了解基于角色的安全性,以及[System.Security.Permissions][2]命名空间中的所有内容。它允许您在运行时使用属性来控制方法的访问。您可以定义自己的自定义属性和授权提供程序。使用它可能看起来像:

public class logicObject {
     @PreAuthorize("hasRole('ROLE_USER')")
           public void update() {
                //Perform
           }

     //...
    }
public class LogicObject
{
    [PrincipalPermissionAttribute(SecurityAction.Demand, Role="ROLE_USER")]
       public void Add()
       {
            //Perform
       }

}

我认为你的第一个例子并不遥远;我将逻辑一分为二:将外部可见的类成员作为一个门面,与实际执行工作的内部私有成员分开。因此,外部facades的任务是接受函数调用,执行安全检查,并根据需要作出响应。这也意味着您对安全检查的位置有一个一致的方法

另一个您可能需要研究的选项是Microsoft企业库,因为它们具有涵盖此类内容的安全块。你可以免费获得一个安全框架,如果你是微软阵营的话,它很有可能成为一个合适的安全框架,并且会有一些示例代码来详细介绍你的问题


我不确定off had的扩展文档在哪里:Tom Hollanders blog可能是一个可以查看的地方,否则您可以从CodePlex获得EntLibs。

看起来您在这里使用的是C样式,因此.Net解决问题的一个可能方法是将属性附加到该方法,该属性定义了执行该方法所需的权限,以您的例子:

public class LogicObject
{
       [PrincipalPermission(Security.Demand, Role="AddItem")]
       public void Add()
       {
            Perform
       }
       [PrincipalPermission(Security.Demand, Role="AddItem")]
       public void Update()
       {
            Perform
       }
}
PrincipalPermission检查Thread.CurrentPrincipal用户,查看该用户是否有权执行相关操作。我还构建了自定义属性,这些属性具有类似的功能,但更多地处理行级安全性,而不是一般的权限或权限


使用属性的优点是,您可以对其进行一次编码,并且该代码适用于属性的每个使用者,而不是反复编写逻辑。

显然,我应该在发布之前彻底阅读Amitay Dobo的文章。在第一个示例中看到了java代码,并跳过了其余部分。我的错。