在优先考虑表达式

时间:2017-07-08 16:24:53

标签: math expression logical-operators specification-pattern

我正在为系统创建复杂的授权模块,该模块将基于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部分)。

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

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)

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

0 个答案:

没有答案