我正在为一个基于规范模式的系统创建一个复杂的授权模块。访问规则定义如下:
operationName
定义规则适用于哪个操作。A
SubjectSpecification
定义规则是否应适用于特定对象Subject
。例如,以下内容将匹配部门 A中的任何主题。subjectSpec = new MyAppSubjectSpecification(division: Division.SOME_DIVISION)
An
AccessSpecification
定义了实际的规则表达式。AccessType
定义匹配规则是授予还是拒绝访问。RulePriorityStrategy
定义如何继承规则的 A。
对于这个问题,假设我们的应用程序Subject
具有以下结构{divisionId, sectionId, groupId, userId }
,并且RulePriority
状态越具体,SubjectSpecification
它的优先级就越高。
例如,针对特定对象的规则userId
将优先于针对该division
用户所属的规则。
现在,这是我不知道如何解决的真正挑战。我希望以高优先级规则从最低优先级规则继承的方式继承规则,同时让它们自己的条件覆盖冲突的最低优先级规则的部分。另请注意,如果没有匹配的授权规则,则默认拒绝操作。
例如,使用以下规则:
- Grant OperationA to all where (A && B) || C
- Grant OperationA to division A where D
- Deny Operation to user xyz where B && E
在这里,我希望用户 xyz(属于 A 部门)在C || D || (A && B && !E)
.
我计划使用最终继承grant
和allow
规则的方式如下:
canPerformOperation = grantSpec.isSatisfiedBy(...) and not (denySpec.isSatisfiedBy(...))
在这种情况下,似乎以以下方式组合会起作用,但并非在所有情况下(例如,当允许必须覆盖拒绝时)。
GR = Grant rule
DN = Deny rule
allowed = (GRn || GRn+1 ... || GRn+x)) && !(DRn || DRn+1 ... || DRn+x)
allowed = ((A && B) || C) || D) && !(B && E)
我做了一些研究,我确信这是逻辑表达式的标准学术知识,但我找不到以某种方式解决问题的标准算法,我确信提出解决方案会让我很很多时间还是不会有效率的。