В предыдущем сообщении в блоге я показал, как реализовать аутентификацию по ключу 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!"
}