|
<?php |
|
# src/Security/AuthorizationChecker.php |
|
|
|
namespace App\Security; |
|
|
|
use Symfony\Component\Security\Core\Authentication\AuthenticationManagerInterface; |
|
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface; |
|
use Symfony\Component\Security\Core\Authorization\AccessDecisionManagerInterface; |
|
use Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface; |
|
use Symfony\Component\Security\Core\Exception\AuthenticationCredentialsNotFoundException; |
|
|
|
class AuthorizationChecker implements AuthorizationCheckerInterface |
|
{ |
|
private $tokenStorage; |
|
private $accessDecisionManager; |
|
private $authenticationManager; |
|
private $alwaysAuthenticate; |
|
|
|
public function __construct(TokenStorageInterface $tokenStorage, AuthenticationManagerInterface $authenticationManager, AccessDecisionManagerInterface $accessDecisionManager, bool $alwaysAuthenticate = false) |
|
{ |
|
$this->tokenStorage = $tokenStorage; |
|
$this->authenticationManager = $authenticationManager; |
|
$this->accessDecisionManager = $accessDecisionManager; |
|
$this->alwaysAuthenticate = $alwaysAuthenticate; |
|
} |
|
|
|
/** |
|
* {@inheritdoc} |
|
* |
|
* @throws AuthenticationCredentialsNotFoundException when the token storage has no authentication token |
|
*/ |
|
final public function isGranted($attributes, $subject = null): bool |
|
{ |
|
if (null === ($token = $this->tokenStorage->getToken())) { |
|
throw new AuthenticationCredentialsNotFoundException('The token storage contains no authentication token. One possible reason may be that there is no firewall configured for this URL.'); |
|
} |
|
|
|
if ($this->alwaysAuthenticate || !$token->isAuthenticated()) { |
|
$this->tokenStorage->setToken($token = $this->authenticationManager->authenticate($token)); |
|
} |
|
|
|
if (!\is_array($attributes)) { |
|
$attributes = [$attributes]; |
|
} |
|
|
|
return $this->accessDecisionManager->decide($token, $attributes, $subject); |
|
} |
|
} |