weitere updates für instanzierbarkeit und sauberes testing
This commit is contained in:
41
lib/Service/Access/AuthorizationService.php
Normal file
41
lib/Service/Access/AuthorizationService.php
Normal file
@@ -0,0 +1,41 @@
|
||||
<?php
|
||||
|
||||
namespace MintyPHP\Service\Access;
|
||||
|
||||
use Throwable;
|
||||
|
||||
class AuthorizationService
|
||||
{
|
||||
/** @var array<int, AuthorizationPolicyInterface> */
|
||||
private array $policies = [];
|
||||
|
||||
/**
|
||||
* @param array<int, AuthorizationPolicyInterface> $policies
|
||||
*/
|
||||
public function __construct(array $policies)
|
||||
{
|
||||
foreach ($policies as $policy) {
|
||||
if ($policy instanceof AuthorizationPolicyInterface) {
|
||||
$this->policies[] = $policy;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public function authorize(string $ability, array $context = []): AuthorizationDecision
|
||||
{
|
||||
foreach ($this->policies as $policy) {
|
||||
if (!$policy->supports($ability)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
try {
|
||||
return $policy->authorize($ability, $context);
|
||||
} catch (Throwable) {
|
||||
return AuthorizationDecision::deny(500, 'authorization_failed');
|
||||
}
|
||||
}
|
||||
|
||||
return AuthorizationDecision::deny(500, 'authorization_policy_missing');
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user