Skip to content

Commit fecea28

Browse files
authored
Merge pull request #397 from WebFiori/feat/access-can-fallback
feat(access): can() fallback to SecurityPrincipal getRoles()
2 parents d2d0a64 + a041a41 commit fecea28

2 files changed

Lines changed: 36 additions & 0 deletions

File tree

WebFiori/Framework/AccessManager.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,10 @@ public function can($user, string $permission, ?object $resource = null): bool {
153153
$userId = is_object($user) && method_exists($user, 'getId') ? $user->getId() : $user;
154154
$roles = $this->getUserRoles($userId);
155155

156+
if (empty($roles) && is_object($user) && method_exists($user, 'getRoles')) {
157+
$roles = $user->getRoles();
158+
}
159+
156160
$hasPermission = false;
157161

158162
foreach ($roles as $roleName) {

tests/WebFiori/Framework/Tests/AccessTest.php

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -648,4 +648,36 @@ public function testPermissionDbId() {
648648
$perm->setDescription('Updated');
649649
$this->assertEquals('Updated', $perm->getDescription());
650650
}
651+
652+
/** @test */
653+
public function testCanFallsBackToUserGetRoles() {
654+
$manager = new AccessManager();
655+
$manager->role('customer', ['VIEW_ORDERS']);
656+
657+
$user = new class {
658+
public function getId() { return 55; }
659+
public function getRoles(): array { return ['customer']; }
660+
};
661+
662+
// No assignRoleToUser() — should fallback to $user->getRoles()
663+
$this->assertTrue($manager->can($user, 'VIEW_ORDERS'));
664+
$this->assertFalse($manager->can($user, 'DELETE_ORDERS'));
665+
}
666+
667+
/** @test */
668+
public function testCanPrefersInternalMapOverGetRoles() {
669+
$manager = new AccessManager();
670+
$manager->role('admin', ['MANAGE']);
671+
$manager->role('viewer', ['VIEW']);
672+
673+
$user = new class {
674+
public function getId() { return 56; }
675+
public function getRoles(): array { return ['viewer']; }
676+
};
677+
678+
// Internal map assigned — getRoles() should NOT be used
679+
$manager->assignRoleToUser(56, 'admin');
680+
$this->assertTrue($manager->can($user, 'MANAGE'));
681+
$this->assertFalse($manager->can($user, 'VIEW'));
682+
}
651683
}

0 commit comments

Comments
 (0)