Я строю API, используя Silex, и я требую, чтобы конечный пользователь отправлял учетные данные через тег заголовка http обычной аутентификации. Я хочу создать собственный обработчик ошибок аутентификации
Я попробовал это, но это не сработало. Функция ошибки никогда не срабатывает
$app['security.authentication.failure_handler.auth'] = function ($app) {
return new AuthFailureHandler($app);
};
$app->register(new SecurityServiceProvider(), array(
'security.firewalls' => array(
'foo' => array('pattern' => '^/foo'), // Example of an url available as anonymous user
'default' => array(
'pattern' => '^.*$',
'http' => true,
'users' => function () use ($app) {
return new UserProvider(new UserRepository($app['db']));
},
),
),
'security.access_rules' => array(
// You can rename ROLE_USER as you wish
array('^/.+$', UserRole::USER),
array('^/foo$', ''), // This url is available as anonymous user
),
));
Это класс обработчика ошибок
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Security\Core\Exception\AuthenticationException;
use Symfony\Component\Security\Http\Authentication\AuthenticationFailureHandlerInterface;
class AuthFailureHandler implements AuthenticationFailureHandlerInterface
{
public function onAuthenticationFailure(Request $request, AuthenticationException $exception)
{
return new JsonResponse(array(
'type' => 'error',
'message' => 'Incorrect username or password.',
));
}
}
Вы определяете этот обработчик для авт брандмауэр (.auth
в $app['security.authentication.failure_handler.auth']
), но должно быть default
так как это тот, который требует аутентификации.
Других решений пока нет …