Symfony security возвращает 401 ответ вместо перенаправления

Я пишу приложение ajax с ajax-аутентификацией, и теперь я начал использовать компонент безопасности symfony в silex для обработки аутентификации / авторизации.
Выполняя простой тест с простой конфигурацией, я перехожу к защищенной зоне с помощью брандмауэра, и ответ, который я получаю, является перенаправлением на страницу /login но то, что мне нужно в моем приложении, – это ответ 401 с возможной дополнительной информацией (в заголовках или json body) о том, как войти в систему.

 $app['security.firewalls'] = [ 'api' => [ 'pattern' => '^/api', 'logout' => ['logout_path'=>'/auth/logout'], 'users' => $app->share(function(Application $app) { return new MyUserProvider(); }) ] ]; 

EDIT: У меня есть намек, но я не уверен, как его использовать. Реализация точки входа с AuthenticationEntryPointInterface Я могу рассказать api, как отвечать на неавторизованные запросы и предоставить пользователю инструкции, необходимые для аутентификации. Это может быть мой ответ 401 с инструкциями для входа.

Solutions Collecting From Web of "Symfony security возвращает 401 ответ вместо перенаправления"

Вам нужен обработчик AuthenticationEntryPoint. Простой пример:

 class AuthenticationEntryPoint implements AuthenticationEntryPointInterface { /** * Starts the authentication scheme. * * @param Request $request The request that resulted in an AuthenticationException * @param AuthenticationException $authException The exception that started the authentication process * * @return Response */ public function start(Request $request, AuthenticationException $authException = null) { $array = array('success' => false); $response = new Response(json_encode($array), 401); $response->headers->set('Content-Type', 'application/json'); return $response; } } 

Зарегистрировать класс как службу в файле services.xml:

 <parameters> <parameter key="authentication_entry_point.class">YourNameSpace\AuthenticationEntryPoint</parameter> </parameters> <services> <service id="authentication_entry_point" class="%authentication_entry_point.class%"/> </services> 

и внести небольшое изменение в файл security.yml:

 security: firewalls: somename: entry_point: authentication_entry_point 

Мне удалось переопределить точку входа по умолчанию для типа «form» в брандмауэре «api» следующим образом:

 $app['security.entry_point.api.form'] = $app->share(function () use ($app) { return new MyAuthenticationEntryPoint(); }); 

Тогда это просто вопрос реализации AuthenticationEntryPointInterface:

http://symfony.com/doc/current/components/security/firewall.html#entry-points

Взгляните на реализацию symfony, чтобы получить представление:

 Symfony\Component\Security\Http\EntryPoint\FormAuthenticationEntryPoint 

Кроме того, вероятно, стоит проверить поставщика службы безопасности silex, чтобы увидеть, как они внедряют это в «security.entry_point.form._proto» по умолчанию.

 Silex\Provider\SecurityServiceProvider