diff --git a/cloud/src/Auth/Rbac.php b/cloud/src/Auth/Rbac.php new file mode 100644 index 0000000..e524c66 --- /dev/null +++ b/cloud/src/Auth/Rbac.php @@ -0,0 +1,15 @@ + ['view_events','acknowledge','edit_zones','manage_thresholds','manage_compliance'], + 'operator' => ['view_events','acknowledge','edit_zones'], + 'viewer' => ['view_events'], + ]; + public static function can(string $role, string $permission): bool { + return in_array($permission, self::MATRIX[$role] ?? [], true); + } +} diff --git a/cloud/tests/RbacTest.php b/cloud/tests/RbacTest.php new file mode 100644 index 0000000..bd7b38f --- /dev/null +++ b/cloud/tests/RbacTest.php @@ -0,0 +1,28 @@ +assertTrue(Rbac::can('viewer', 'view_events')); + $this->assertFalse(Rbac::can('viewer', 'acknowledge')); + $this->assertFalse(Rbac::can('viewer', 'edit_zones')); + } + public function testOperator(): void { + $this->assertTrue(Rbac::can('operator', 'acknowledge')); + $this->assertTrue(Rbac::can('operator', 'edit_zones')); + $this->assertFalse(Rbac::can('operator', 'manage_thresholds')); + } + public function testAdminAll(): void { + foreach (['view_events','acknowledge','edit_zones','manage_thresholds','manage_compliance'] as $p) { + $this->assertTrue(Rbac::can('admin', $p)); + } + } + public function testUnknownDenied(): void { + $this->assertFalse(Rbac::can('ghost', 'view_events')); + $this->assertFalse(Rbac::can('admin', 'unknown_perm')); + } +}