matrixai / abac-schema
ABAC 接口
Requires
- php: >=7.1
- phpoption/phpoption: ^1.5
Requires (Dev)
- psy/psysh: @stable
This package is not auto-updated.
Last update: 2024-09-18 20:45:56 UTC
README
该模式是原生的,但这是我们可以达到的与 Haskell 风格的代数数据类型和记录类型最接近的一种。处理关联性是通过将接口强制实施提升到编译时或在运行时更高阶段来完成的。
在未来,一个宏生成器可以使模式更容易创建,如果有一种方法可以自动将 JSON 模式转换为这种模式,那么它将是跨平台的。
当没有编译器/自动工具来强制实施分布式系统不同部分的接口时,会使用魔法字符串。
充实 Prolog 授权强制执行的示例。这需要修复 Prolog 自动加载器。
嵌套属性也应该是扩展 AbstractAttributes 的一个类,对于所有这些都可以使用相同的构建方法。
此外,这里的 PHP 模式本质上是 Maybe。因此,每个属性都是可选的。然而,在更复杂的类型系统中,人们必须能够说特定的属性是必需的。目前做到这一点的唯一方法是通过覆盖构造函数并检查是否将特定的属性传递到数组中。
传递给控制器的策略类型不应仅仅是策略的类类型,而应该是 Policy<AuthAttributes>
,即由它所理解的属性参数化的策略对象。属性代表控制器所说和发出的语言。虽然策略需要能够理解这种语言。所以我们抽象出语言作为接口(作为扩展 AbstractAttributes
的最终类实现),控制器和策略都依赖于它。然而,PHP 中没有泛型(参数多态),所以我们只能使用策略类作为类型提示。
另一个问题是,为了使策略理解语言,它不仅仅是接口键,还包括理解键的值。对于许多事情,它可以是真或假。但一个重要的属性是 ACTION_PATH
,这里是指控制器请求是否访问资源的类和函数的绝对命名空间路径。因此,策略需要知道这里请求的是哪种操作,在 MAC 考虑下,这意味着策略需要了解所有相关的控制器。这意味着我们在控制器内部使用一个常量来表示特定函数的操作路径,以便策略也可以调用控制器来获取相关的路径。可以使用魔法字符串来代替,但我们想避免这样做,所以使用更强的魔法字符串概念,即可以由静态分析工具检查的术语,即命名空间作用域运算符 ::
。注意,如果你扩展控制器以替换它,你必须重新定义所有访问常量,如果你也替换了函数。这是因为每个访问常量都引用 self
。
在示例启动 vendor/bin/psysh
$u = new ABACExamples\UserController(new ABACExamples\UserAuthPolicy); $u->testAccess();
上面的代码仅在 PHP 7.1 上有效,但同样的原则可以在较旧的 PHP 版本上实现。