0

是否可以使用 AzMan 对在运行时创建的对象进行基于角色的授权?如果是,如何做到这一点?

例如:

如果在运行时创建了“CustomAlert”类的对象,我想看看我是否可以对“CustomAlert”类的不同对象有不同的规则。如果使用特定用户的身份创建对象,则该用户可以使用更多权限,认为他是对象的创建者/所有者。只有创建者/所有者可以修改对象。

4

2 回答 2

4

当然可以为此使用 AzMan。我已经使用这种形式的基于资源和角色的安全性实现了几个应用程序。AzMan 实际上非常灵活,而且我还实现了资源层次结构(想想 Windows 文件系统安全性),具有自定义用户和组以及整个层次结构中角色的完全继承,以及拒绝任何级别的操作的能力。为此,您需要了解 AzMan Scopes。

AzMan 范围允许您为特定资源创建单独的角色/操作集。此资源可以是您选择的任何内容,它只是 AzMan 的字符串标识符。这些角色/操作是对任何应用程序级别分配的角色的补充。

我之前实现它的方式是使用对象的 id 作为范围名称。理想情况下,为简单起见,这应该是一个 GUID(尽管它确实使 MMC 应用程序非常混乱),但同样您可以使用“type-id”格式,即“CustomerAlert-1”(在 MMC 应用程序中更友好)。在 azman 中执行 AccessCheck 时,您将范围名称传递给 AccessCheck(目前它只需要一个范围,即使 AccessCheck 定义允许使用数组)。

我将通过一个例子来说明如何做到这一点(对于其他任何挣扎的人)......

  1. 在应用程序级别创建诸如 CustomerAlertView、CustomerAlertEdit、CustomerAlertDelete 之类的操作。
  2. 在应用程序级别创建一个名为 CustomerAlertOwner 的角色定义。
  3. 将所有操作添加到 CustomerOwner 角色。
  4. 在您的应用程序中,创建一个名为“CustomerAlert-1”的 Scope。
  5. 在范围上创建一个名为“所有者”的角色分配。
  6. 将 CustomerAlertOwner 角色定义添加到“所有者”角色分配。
  7. 向此所有者角色添加客户/用户“Dave”。
  8. 现在,当您在 DeleteCustomerAlert() 中进行访问检查时,您只需将 CustomerAlertDelete 操作的 ID 和要删除的对象的类型/ID 作为范围即“CustomerAlert-1”传递

对于基于对象属性的访问检查(即锁定某些属性的读/写),我可以想到两种方法..首先是在对象范围内为每个属性和访问类型分配操作,即 PropertyNameGet、PropertyNameSet、PropertyAddressAdd . 您可以通过在应用程序级别创建操作并使用任务/角色对常用权限集进行分组来简化此操作。另一种方法是使用每个属性的范围(CustomerAlert-1-Name),但这会很麻烦并且效率不高,因为在访问给定对象时需要单独加载多个范围。

您应该记住,您不能在 AzMan 中明确拒绝操作,您只是没有在应用程序/范围内为用户分配角色。这意味着某些类型的资源层次结构(组/用户)等可能更难以实现。

如果您需要有关 AzMan 的任何进一步帮助,请随时提出。我已经介绍了大多数情况。

于 2009-11-12T18:44:41.720 回答
0

Azman 支持基于角色的安全性,但它仅基于角色而不是 ACL。如果特定用户已登录,则根据他们的身份,他们具有特定的权限,但这些权限只是静态值 - 它们可以应用于给定类型的所有对象,但不会根据特定的特定属性而有所不同该类型的实例。

于 2009-08-24T13:17:08.663 回答