В предыдущем сообщении в блоге я показал, как реализовать аутентификацию по ключу API для REST API с помощью Ma27ApiKeyAuthenticationBundle. Рабочий процесс входа в систему довольно прост, но его следует расширять для определенных бизнес-требований приложений, использующих этот пакет. В этом сообщении блога я покажу, как работать с системой событий рабочего процесса входа в систему, используя простой пример, чтобы подключиться к процессу с помощью пользовательских слушателей.
Полный обзор всех событий, предоставляемых этим пакетом, можно найти в документах.
Подготовка
Прежде чем приступить к фактическому коду, нам нужна модель пользователя для наших целей.
В этом случае отображаются только фрагменты кода, относящиеся к данному руководству.
Прослушиватель событий
Директива login содержит несколько событий, которые могут использоваться приложениями для подключения к определенным процессам:
ma27_api_key_authentication.credential_failure, который будет запущен, если проверка учетных данных не пройденаma27_api_key_authentication.authentication, который будет запущен, если проверка учетных данных пройдет успешно
ПРИМЕЧАНИЕ:
ma27_api_key_authentication.authenticationбудет запущено до генерации токена, поскольку это событие можно использовать для запуска дальнейших процессов проверки, которые могут привести к сбою входа в систему, поэтому безопаснее генерировать послесловие ключа API.
Как описано выше, событие ma27_api_key_authentication.authentication может использоваться для сбоя процесса аутентификации. Это можно сделать, выдав CredentialException, который перехватывается контроллером и преобразуется в ответ 401 Unauthorized. Если CredentialException не содержит сообщения, Credentials refused! является значением по умолчанию, которое будет использоваться в ответе.
В нашем случае нам нужен класс, слушающий ma27_api_key_authentication.authentication, чтобы проверить, заблокирован пользователь или нет.
Контроллер пытается перевести каждое сообщение, доставленное CredentialException, используя каталог messages компонента перевода Symfony:
Если заблокированный пользователь сейчас попытается войти в систему, ответ 401 будет выглядеть так:
{
"message": "You're blocked!"
}