1

我正在为一个基于规范模式的系统创建一个复杂的授权模块。访问规则定义如下:

  • operationName定义规则适用于哪个操作。

  • ASubjectSpecification定义规则是否应适用于特定对象Subject。例如,以下内容将匹配部门 A中的任何主题。

    subjectSpec = new MyAppSubjectSpecification(division: 
    Division.SOME_DIVISION)
    
  • AnAccessSpecification定义了实际的规则表达式。

  • 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).

我计划使用最终继承grantallow规则的方式如下:

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)

我做了一些研究,我确信这是逻辑表达式的标准学术知识,但我找不到以某种方式解决问题的标准算法,我确信提出解决方案会让我很很多时间还是不会有效率的。

4

0 回答 0