想象一下一家电力公司的数据模型,以及它所驱动的城市。该公司有几个部门,管理着城市中至少一个街区。该公司的数据库包括每个社区的住宅信息,安装在家中的计价器,记帐历史等。部门中的任何员工都可以登录并查看所有不同类型的数据,但他们只能查看部门管理的邻居的数据。示例模式:
部门
邻里
DepartmentsToNeighborHoods (LinkTable)
员工
安家
计量器
考虑到这个数据模型,我正在尝试实现一个restful接口,在这个接口中,员工可以提取数据,但只能在他们所在部门的资源上。例如,如果员工希望访问特定家庭的计费历史记录,则只有当该家庭位于由员工部门管理的社区时,才能访问该记录。
我能想到这样做的唯一方法是实现一个权限函数,该函数检查用户是否可以访问给定其用户id的特定资源。A可能的实现(伪码):
getMeterDetails(meterID, employeeID) {
permissionQuery = "
select 1
from Meters
join Homes on Homes.ID = Meters.HomeID
join Neighborhoods on NeighborHoods.ID = Homes.NeighborHoodID
join DepartmentsToNeighborhoods as DTN on DTN.NeighborhoodID = Neighborhoods.ID
join Employees on Employees.DepartmentID = DTN.DepartmentID
where Meters.ID = ?
and Employees.ID = ?
"
result = db.runQuery(permissionsQuery, meterID, employeeID)
if (result == 1) {
return MeterModel.get(meterID);
}
else {
return ERROR_VALUE;
}
}一般的问题是,我想限制访问特定资源的基础上,在另一个遥远的相关资源的成员资格。我的当前方法要求每次请求资源时都要进行额外的数据库查询。我还必须为我公开的每个资源编写自定义权限查询,因为每个资源都使用不同的关系集来确定是否允许当前员工访问这个特定资源。是否有更好的方法来实现这种权限控制?
发布于 2017-11-01 20:00:47
这是对你问题的更详细的答复。您遇到的挑战是,您有具有多个参数/维度的授权需求。您想要定义的权限不仅取决于用户的身份、角色或组,而且还基于他们要访问的数据,更重要的是用户和数据之间的关系。
最流行的授权框架是所谓的RBAC或基于角色的访问控制。RBAC由国家标准和技术研究所NIST正式确定。在您的例子中,RBAC面临的挑战是,它是以身份为中心的,因为它只考虑用户的参数(角色、组)。您可以定义一个角色(例如manager ),该角色将被分配给权限(如viewMeterData )。但这对你来说还不够。
为了解决这个问题,NIST提出了一个基于属性的访问控制( ABAC )模型。在ABAC中,您现在可以使用更多的元数据/参数。例如,你可以考虑:
所有这些都被称为属性。属性是ABAC的基础,因此它的名称。您可以将这些属性组合成策略。政策有点像ABAC的秘方。策略可以授予和拒绝访问权限。例如:
策略可以用来表示高级场景。
有两种主要语法可用于编写策略:
ABAC还提供了一个体系结构来定义如何评估和执行策略。

该体系结构包含以下组件:
https://softwareengineering.stackexchange.com/questions/360028
复制相似问题