掌握您的要求
您需要的是一个足以处理您的需求的授权框架。在你的帖子中,你提到你有
- 权限,例如读/写/编辑/删除
- 其他参数,例如 Owner,SamePseudoCity 表示不同的东西:
- 允许用户访问他仅创建的记录
- 以用户身份返回属于 PsuedoCity 的记录。
基于属性的访问控制
您需要转向 [tag: ABAC](基于属性的访问控制),这将使您能够使用属性(键值对)和策略来定义您的需求。策略在称为策略决策点 (PDP) 的第 3 方引擎内进行维护和评估。
ABAC 是NIST定义的标准。它是 RBAC(基于角色的访问控制)的演变。XACML,可扩展访问控制标记语言是 ABAC 的实现,
您可以将abac应用到架构中的不同层,从UI(表示层)到业务层,一直到数据层。
策略以alfa或xacml表示。
例子:
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
}
}
}
下一步
然后,您需要部署一个策略决策点/策略服务器。您可以从以下几个中进行选择:
- Axiomatics Policy Server(免责声明我为 Axiomatics 工作)
- SunXACML
- Oracle 权利服务器
- WSO2 身份服务器
如果您想将您的策略同时应用于 UI 和数据库,那么您可以通过称为Data Access Filter MD的 Axiomatics 产品使用称为动态数据屏蔽的功能。

更新
OP后来评论了以下内容
ABAC”从未听说过,听起来很棒,但我认为我需要访问专用服务器或 VPS 才能安装 PDP,对吗?.. 我知道这可能太多了,但我有 3 个问题,我可以通过编程方式改变规则吗?是否可以实现这种场景,每个产品都有一个伪城市,每个经理也有一个伪城市,经理只能访问他们自己的城市产品?是否可以做简单的读/写/编辑规则和基于此隐藏和显示 UI?-</p>
所以首先,让我们从 ABAC 架构图开始:
- PEP 是策略执行点,负责保护您的应用程序、API 和数据库。它执行授权决定。
- PDP 是策略决策点,负责评估策略并做出决策。它处理从 PEP 收到的请求并返回授权决定(许可、拒绝)。
- PAP 是您定义和管理策略的策略管理点
- PIP 是策略信息点。它是 PDP 用来连接到第三方属性源的接口,例如用户 LDAP、数据库或 Web 服务。当 PDP 需要了解有关用户或资源的更多信息时,它会使用 PIP。

我假设我需要访问专用服务器或 VPS 来安装 PDP,对吗?
是的,您可以在服务器(或云)上安装 PDP。它成为您基础设施的一部分。
我可以以编程方式更改规则吗?
是的你可以。Axiomatics PAP 有一个 API,您可以使用它以编程方式上传、导出和创建策略。
是否可以实现每个产品都有一个伪城市并且每个经理也有一个伪城市并且经理只能访问他们自己的城市产品的场景?
是的,这实际上是我在原始示例中所写的,这就是 ABAC 的美妙之处。无论城市数量如何,您都编写了一个有效的策略:A user can view a record if user.city==record.city
是否可以执行简单的读/写/编辑规则并基于此隐藏和显示 UI?
是的,您可以在策略中使用任意数量的属性。因此,例如,您可以:
- 拒绝用户访问其所在城市以外的记录
- 用户可以查看记录
- 用户可以编辑他们拥有的记录
- 用户可以批准他们不拥有的记录
您可以使用该逻辑在您的 UI 或业务层甚至数据层驱动授权。所以你可以问PDP:
- 我可以显示编辑按钮吗?
- 我可以显示详细信息按钮吗?
- 我可以显示删除按钮吗?