حسنًا ، بعد البحث في رمز الحزمة ، اكتشفت ذلك. تنتج المشكلة عن الطريقة التي يتم بها التعامل مع أوراق الاعتماد السيئة من خلال الفكين المصادقة الأساسي لـ Symfony HTTP. ال 401 Bad Credentials
الاستجابة هي استجابة مخصصة تم إنشاؤها بواسطة BasicAuthenticationEntryPoint
, التي تسمى من قبل BasicAuthenticationListener
'س handle
وظيفة ، مباشرة بعد AuthenticationException
تم إلقاؤه في نفس الوظيفة. لذلك لا توجد طريقة لالتقاط هذا الاستثناء مع المستمع:
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));
}
}
نقطة الدخول start
تعمل الوظيفة على إنشاء استجابة مخصصة ، مع عدم وجود استثناءات:
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;
}
القبضة if
-رصفة في handle
تشرح الوظيفة أعلاه أيضًا سبب عملها في حالة "عدم وجود بيانات اعتماد مستخدم على الإطلاق" ، لأنه في هذه الحالة ، يتوقف المستمع فقط عن محاولة مصادقة المستخدم ، وبالتالي سيتم إلقاؤه استثناء من قبل مستمعي جدار الحماية في Symfony (ليس متأكدًا تمامًا من أين بالضبط) ، حتى fosrestbundle AccessDeniedListener
قادر على التقاط AuthenticationException
ويفعل الشيء.