我正在为系统创建复杂的授权模块,该模块将基于specification pattern。访问规则定义如下:
operationName
定义规则适用于哪种操作。
SubjectSpecification
定义规则应该应用于特定的Subject
。例如。以下内容将匹配分区A 中的任何主题。
subjectSpec = new MyAppSubjectSpecification(division:
Division.SOME_DIVISION)
AccessSpecification
定义实际的规则表达式。
AccessType
定义匹配规则授予或拒绝访问权限。
定义规则应如何继承的RulePriorityStrategy
。
对于这个问题,我们假设我们的应用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
这里我希望C || D || (A && B && !E)
时允许用户xyz(属于A部分)。
我计划使用最终继承的grant
和allow
规则的方式如下:
canPerformOperation = grantSpec.isSatisfiedBy(...) and not (denySpec.isSatisfiedBy(...))
在这种情况下,似乎以下列方式组合可行,但并非在所有情况下都有效(例如,当allow必须覆盖拒绝时)。
GR = Grant rule
DN = Deny rule
allowed = (GRn || GRn+1 ... || GRn+x)) && !(DRn || DRn+1 ... || DRn+x)
allowed = ((A && B) || C) || D) && !(B && E)
我做了一些研究,我确信这是逻辑表达式的标准学术知识,但我找不到以某种方式解决问题的标准算法,我肯定会提出解决方案我需要花很多时间或者效率不高。