Okay, nachdem ich noch mehr in den Code des Bundles eingegraben hatte, habe ich es herausgefunden. Das Problem ergibt sich aus der Art und Weise, wie schlechte Anmeldeinformationen von Symfonys HTTP -Basis -Authentifizierungs -Impementation behandelt werden. Das 401 Bad Credentials
Die Antwort ist eine benutzerdefinierte Antwort, die von erstellt wurde durch BasicAuthenticationEntryPoint
, was von der genannt wird BasicAuthenticationListener
's handle
Funktion, unmittelbar nach einem AuthenticationException
wurde in die gleiche Funktion geworfen. Es gibt also keine Möglichkeit, diese Ausnahme mit einem Zuhörer zu fangen:
public function handle(GetResponseEvent $event)
{
$request = $event->getRequest();
if (false === $username = $request->headers->get('PHP_AUTH_USER', false)) {
return;
}
if (null !== $token = $this->securityContext->getToken()) {
if ($token instanceof UsernamePasswordToken && $token->isAuthenticated() && $token->getUsername() === $username) {
return;
}
}
if (null !== $this->logger) {
$this->logger->info(sprintf('Basic Authentication Authorization header found for user "%s"', $username));
}
try {
$token = $this->authenticationManager->authenticate(new UsernamePasswordToken($username, $request->headers->get('PHP_AUTH_PW'), $this->providerKey));
$this->securityContext->setToken($token);
} catch (AuthenticationException $failed) {
$this->securityContext->setToken(null);
if (null !== $this->logger) {
$this->logger->info(sprintf('Authentication request failed for user "%s": %s', $username, $failed->getMessage()));
}
if ($this->ignoreFailure) {
return;
}
$event->setResponse($this->authenticationEntryPoint->start($request, $failed));
}
}
Der Einstiegspunkt start
Die Funktion erstellt die benutzerdefinierte Antwort ohne Ausnahmen:
public function start(Request $request, AuthenticationException $authException = null)
{
$response = new Response();
$response->headers->set('WWW-Authenticate', sprintf('Basic realm="%s"', $this->realmName));
$response->setStatusCode(401, $authException ? $authException->getMessage() : null);
return $response;
}
Die Faust if
-Ceil in der handle
Die obige Funktion erklärt auch, warum es im Fall von "überhaupt keine Benutzeranmeldeinformationen" funktioniert, da der Hörer in diesem Fall nur nicht mehr versucht, den Benutzer zu authentifizieren, und daher eine Ausnahme von Symfonys Firewall -Hörern ausgelöst wird (nicht ganz sicher, wo genau), also fosrestbundle's AccessDeniedListener
ist in der Lage, das zu fangen AuthenticationException
und tun sein Ding.