我正在构建某种复杂的库存系统,接受供应商的报价等。
通常我会有读取/写入/编辑/删除等基本权限,我可以轻松更新每个页面上的读取和写入bool变量,以检查是否为true,否则执行此操作。
但事实并非如此。我有一些权限,如(Owner,SamePseudoCity),分别表示允许用户访问他只创建的记录,另一个表示返回属于PsuedoCity的记录作为用户。
目前,UI具有适用权限的局部变量,当UI从数据库请求某些数据时,它会调用BL,该BL首先获取用户有权使用的权限,并将它们绑定到UI / Page本地变量。
它还会检查权限列表是否包含“所有者”#39;然后它将获取UserID创建的记录,如果它包含' SamePseudoCity'它将获得同一城市的所有记录。
我不确定这是不是一个好的设计,如果我可以修改它。我知道这里没有对错,但有臭味的设计,好的设计和更好的设计。所以,如果有人在此之前实现了这一点,我只是在寻找一些想法。
解决我的问题需要花很多时间,如果它还不清楚请告诉我,我可以从我的代码中发布一些片段。
答案 0 :(得分:2)
您需要的是一个能够满足您要求的授权框架。在你的帖子中,你提到你有
您需要转向[tag:ABAC](基于属性的访问控制),这将使您能够使用属性(键值对)和策略定义您的需求。策略在称为策略决策点(PDP)的第三方引擎内维护和评估。
ABAC是由NIST定义的标准。它是RBAC(基于角色的访问控制)的演变。 XACML,可扩展访问控制标记语言是ABAC的实现,
您可以将abac应用于架构中的不同层,从UI(表示层)到业务层,一直到数据层。
namespace stackoverflow{
首先定义属性
namespace user{
attribute identifier{
category = subjectCat
id = "user.identifier"
type = string
}
attribute city{
category = subjectCat
id = "user.city"
type = string
}
}
namespace item{
attribute owner{
category = resourceCat
id = "item.owner"
type = string
}
attribute city{
category = resourceCat
id = "item.city"
type = string
}
}
attribute actionId{
category = actionCat
id = "actionId"
type = string
}
然后定义使用这些属性的策略
/**
* Control access to the inventory
*/
policy inventory{
apply firstApplicable
/**
* Anyone can view a record they own
*/
rule viewRecord{
target clause actionId == "view"
condition user.identifier == item.owner
permit
}
/**
* Anyone can view a record that is in the same city
*/
rule viewRecordsSameCity{
target clause actionId == "view"
condition user.city == item.city
permit
}
}
}
然后,您需要部署策略决策点/策略服务器。您可以从以下几种中进行选择:
如果要将策略应用于UI和数据库,则可以通过名为Data Access Filter MD的Axiomatics产品使用名为动态数据屏蔽的功能。
OP稍后评论了以下内容
ABAC"从来没有听说过这听起来很棒但是我想我需要访问专用服务器或VPS才能安装PDP,对吗? ..我知道这可能太多了,但我有3个问题,我可以通过编程方式更改规则吗?是否有可能实现这样的场景:每个产品都有一个伪城市,每个经理都有一个伪城市,经理只允许访问他们自己的城市产品?是否有可能做简单的读/写/编辑规则,并隐藏和显示基于此的UI? -
首先,让我们从ABAC架构图开始:
我认为我需要访问专用服务器或VPS才能安装PDP,对吧?
是的,您可以在服务器(或云端)上安装PDP。它成为您基础设施的一部分。
我可以通过编程方式更改规则吗?
是的,你可以。 Axiomatics PAP有一个API,您可以使用它以编程方式上载,导出和创建策略。
是否有可能实现这样的场景:每个产品都有一个伪城市,每个经理都有一个伪城市,经理只允许访问他们自己的城市产品?
是的,这实际上就是我在原始例子中所写的,那就是ABAC的美丽。您编写的单一政策无论城市数量多少都有效:A user can view a record if user.city==record.city
可以做简单的读/写/编辑规则,并根据它隐藏和显示UI吗?
是的,您可以在策略中使用任意数量的属性。例如,您可以:
您可以使用逻辑来驱动UI或业务层甚至数据层的授权。所以你可以问PDP: