Нужно сделать гостевую и авторизованную корзину на одном роуте. Использую ApiTokenAuthenticator, но, когда пользователь не авторизован, бросает исключение. Как это обойти, чтобы можно было продолжать работу без авторизации на конкретном роуте? Или как можно это сделать?
Максим Федоров, хм:) это действительно так с первого взгляда, но не совсем)
когда я открываю роут, то ApiTokenAuthenticator уже не имеет смысла, потому что он не работает
<?php
namespace App\Security;
use App\Service\ApiTokenService;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\Security\Core\Exception\AuthenticationException;
use Symfony\Component\Security\Core\User\UserInterface;
use Symfony\Component\Security\Core\User\UserProviderInterface;
use Symfony\Component\Security\Guard\AbstractGuardAuthenticator;
class ApiTokenAuthenticator extends AbstractGuardAuthenticator
{
private ApiTokenService $apiTokenService;
/**
* TokenAuthenticator constructor.
* @param ApiTokenService $apiTokenService
*/
public function __construct(ApiTokenService $apiTokenService)
{
$this->apiTokenService = $apiTokenService;
}
public function start(Request $request, AuthenticationException $authException = null): JsonResponse
{
return new JsonResponse(['error' => 'Authentication required'], 401);
}
public function supports(Request $request): bool
{
return $request->headers->has('Authorization');
}
public function getCredentials(Request $request)
{
return $request->headers->get('Authorization');
}
public function getUser($credentials, UserProviderInterface $userProvider): ?UserInterface
{
return $this->apiTokenService->getUserByToken($credentials);
}
public function checkCredentials($credentials, UserInterface $user): bool
{
return true;
}
public function onAuthenticationFailure(Request $request, AuthenticationException $exception): JsonResponse
{
return new JsonResponse(['error' => 'Authentication required'], 401);
}
public function onAuthenticationSuccess(Request $request, TokenInterface $token, string $providerKey)
{
return null;
}
public function supportsRememberMe(): bool
{
return false;
}
}
Максим Федоров, одним словом я не могу сделать так, чтобы анонимный пользователь видел не
public function onAuthenticationFailure(Request $request, AuthenticationException $exception): JsonResponse
{
return new JsonResponse(['error' => 'Authentication required'], 401);
}
а то что мне нужно, т.е. продолжал работу в контроллере.
Когда же я пытаюсь вернуть null в onAuthenticationFailure вместо ошибки, то мне возвращает пользователя (когда я делаю проверку $this->container->get('security.token_storage')->getToken()->getUser()). Это странно.