Добрый день!
Проблема такова, если пользователь заходит на
API-firewall и у него токен не совпадает или токена нет, то смотрим другой firewall и проверяем:
-если залогинен на другом firewall то пускаем в API-firewall
-если не залогинен то отправляем на форму логина
пытался сделать используя
Firewall context
пытался сделать используя
multiple User Providers
в итоге сделал костыльно и прошу помощи сделать нормально
class ApiKeyAuthenticator implements SimplePreAuthenticatorInterface, AuthenticationFailureHandlerInterface
{
/**
* HttpHeaderAuthenticator constructor.
*/
public function __construct()
{
}
/**
* @param Request $request
* @param $providerKey
* @return PreAuthenticatedToken
*/
public function createToken(Request $request, $providerKey)
{
if (!$request->headers->has('apikey')) {
$session = $request->getSession();
if(null !== $session && ($token = $session->get('_security_main'))) {
...
$request->headers->add(array('apikey' => $token->getCredentials()));
} else {
throw new BadCredentialsException('Not found access token!');
}
}
return new PreAuthenticatedToken('anon.',
$request->headers->get('apikey'),
$providerKey);
}
/**
* @param TokenInterface $token
* @param $providerKey
* @return bool
*/
public function supportsToken(TokenInterface $token, $providerKey)
{
return $token instanceof PreAuthenticatedToken && $token->getProviderKey() === $providerKey;
}
/**
* @param TokenInterface $token
* @param UserProviderInterface $userProvider
* @param $providerKey
* @return PreAuthenticatedToken
*/
public function authenticateToken(TokenInterface $token, UserProviderInterface $userProvider, $providerKey)
{
...
$username = $userProvider->getUsernameForApiKey($token->getCredentials());
if (!$username) {
throw new AuthenticationException(
sprintf('API Key "%s" does not exist.', $apiKey)
);
}
$authenticatedToken = new PreAuthenticatedToken($username, $token->getCredentials(), $providerKey);
$authenticatedToken->setAuthenticated(true);
return $authenticatedToken;
}
/**
* This is called when an interactive authentication attempt fails. This is
* called by authentication listeners inheriting from
* AbstractAuthenticationListener.
*
* @param Request $request
* @param AuthenticationException $exception
*
* @return Response The response to return, never null
*/
public function onAuthenticationFailure(Request $request, AuthenticationException $exception)
{
return new Response("Please log in the system: <a href='/'>link</a>, or use token");
}