Я пишу приложение 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 с инструкциями для входа.
Вам нужен обработчик 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