6

坦率地说,我有一个实体级授权的要求。我希望获得有关此权限结构的一些指导,我如何在 .NET 4.5 中实现它,以及是否有办法改进它。

它是这样的:


我有一组数据结构如下:

在此处输入图像描述

在哪里

  • aFleet是零个或多个 的集合Cars
  • aFleet可以包含其他Fleets

以后可以出于组织目的对舰队进行重组和移动。

我在系统中有几个角色具有与这些实体相关的权限:

  • 所有者:可以从车队中添加或删除汽车
  • 经理:将司机分配给汽车
  • 司机:被允许简单地驾驶汽车
  • 机械师:可以修车

授权逻辑允许User系统中的 a 被授予对具有一个或多个角色的 aFleet或 a 的访问权限。Car

以下是一些有助于解释的场景:

  1. 如果我授予User Jim以角色访问Fleet #5Driver的权限,则允许他驾驶车队 #2 下的任何汽车。由此产生的权限允许他驾驶 #4、5、6 号汽车
  2. 如果我授予用户MauraCar #1作为 Mechanic 的访问权限,则生成的权限允许她仅修复 #1 车。
  3. 如果我授予用户SarahOwner使用角色and访问 Fleet #2 的权限Mechanic,则允许她向 Fleet #2、4、5 添加和删除汽车,并且允许她修复汽车 #1、2、3、4、5、6 .
  4. 如果我授予用户Jeremy对车队 #1 的访问权限以及Owner 车队 #6 的访问Driver权限,则生成的权限允许他向所有车队添加和删除汽车并驾驶汽车 #7、8。他不能驾驶除 # 之外的任何其他汽车7 和 8。

这种实体级授权的好方法是什么?

如果重要的话,我们使用 .NET 4.5.1 和 EF6 Code First,构建在ASP.net Boilerplate 之上

4

1 回答 1

1

您想要实现的细粒度授权让我想起了CakePHP 的访问控制列表 (ACL) 描述中的访问控制对象 (ACO - 想要的东西) 和访问请求对象 (ARO - 想要的东西),但有一些变化:

简而言之:

您有 ARO(所有者、经理、驾驶员、机械师)将要求的 ACO(车队和汽车)。如果您想知道请求者是否有权访问某个对象,您可以找到该对象的路径(Can John access "Car #3"?:find "Car #3"'s path from root: Fleet #1 > Fleet #2 > Car #3),然后将默认权限“拒绝”分配给每个节点,但要切换如果该节点在请求者的允许节点列表中,则它为“允许”。如果最后一个节点以“允许”结尾,那么,好吧......允许,否则拒绝。

首先理解逻辑是关键。任何语言的实现都排在第二位。

我希望它为您指明正确的方向。

干杯,

于 2017-03-06T15:31:55.067 回答