diff --git a/src/Security/Voter/UserVoter.php b/src/Security/Voter/UserVoter.php new file mode 100644 index 0000000..1d859e1 --- /dev/null +++ b/src/Security/Voter/UserVoter.php @@ -0,0 +1,39 @@ +getUser(); + + return $user instanceof User && $user->getUserIdentifier() === $subject->getUserIdentifier() + ? self::ACCESS_GRANTED + : self::ACCESS_DENIED; + } +} diff --git a/tests/Functional/DoctrineCest.php b/tests/Functional/DoctrineCest.php index c6281ee..cc54e0a 100644 --- a/tests/Functional/DoctrineCest.php +++ b/tests/Functional/DoctrineCest.php @@ -44,6 +44,11 @@ public function seeNumRecords(FunctionalTester $I) $I->seeNumRecords(1, User::class); } + public function seeDoctrineSchemaIsValid(FunctionalTester $I): void + { + $I->seeDoctrineSchemaIsValid(); + } + public function queryCountAssertions(FunctionalTester $I): void { $I->amOnPage('/run-queries'); diff --git a/tests/Functional/SecurityCest.php b/tests/Functional/SecurityCest.php index beddba0..5d3152e 100644 --- a/tests/Functional/SecurityCest.php +++ b/tests/Functional/SecurityCest.php @@ -5,6 +5,7 @@ namespace App\Tests\Functional; use App\Entity\User; +use App\Security\Voter\UserVoter; use App\Tests\Support\FunctionalTester; final class SecurityCest @@ -70,6 +71,30 @@ public function seeUserHasRoles(FunctionalTester $I) $I->seeUserHasRoles(['ROLE_USER', 'ROLE_CUSTOMER']); } + public function seeUserIsGranted(FunctionalTester $I): void + { + $user = $I->grabEntityFromRepository(User::class, [ + 'email' => 'john_doe@gmail.com', + ]); + $I->amLoggedInAs($user); + $I->amOnPage('/'); + + $I->seeUserIsGranted('ROLE_CUSTOMER'); + $I->seeUserIsGranted(UserVoter::EDIT, $user); + } + + public function dontSeeUserIsGranted(FunctionalTester $I): void + { + $user = $I->grabEntityFromRepository(User::class, [ + 'email' => 'john_doe@gmail.com', + ]); + $I->amLoggedInAs($user); + $I->amOnPage('/'); + + $I->dontSeeUserIsGranted('ROLE_ADMIN'); + $I->dontSeeUserIsGranted(UserVoter::EDIT, User::create('jane_doe@gmail.com', '123456')); + } + public function seeUserPasswordDoesNotNeedRehash(FunctionalTester $I) { $user = $I->grabEntityFromRepository(User::class, [