Безопасность — Symfony Framework Documentation documentation

Creating a website with symonfy 4: part 2

В предыдущем посте мы обсудили, как настроить наш проект Symfony 4, и создали контроллер главной домашней страницы, а также познакомились с Twig. Сегодня мы собираемся расширить уроки прошлой недели и сделать систему входа и регистрации для нашего приложения!

Настройка новых библиотек

Работа с базой данных невероятно проста с помощью ORM Doctrine. Он делает написание кода, связанного с базой данных, гораздо более приятным, чем написание стандартных запросов. По сути, Doctrine преобразует каждую запись в вашей базе данных в сущность или объект.

С помощью библиотеки Symfony Forms вы можете разработать и создать форму на PHP в виде объекта, а затем отобразить ее в представлении или шаблоне. Она использует библиотеку валидации для обработки любой логики проверки ввода, создавая объект Doctrine, который затем может быть сохранен в вашей базе данных.

Csrf-защита в формах входа¶

CSRF-атаки входа можно предотвратить, используя ту же технику добавления спрятанных
CSRF-токенов в формы входа. Компонент Безопасность уже предоставляет CSRF-защиту,
но вам нужно сконфигурировать некоторые опции перед ее использованием.

Форма входа в систему должна сначала иметь CSRF-функцию:

Затем, используйте функцию csrf_token() в шаблоне Twig, чтобы сгенрировать
CSRF-токен и сохранить его в качестве скрытого поля формы. По умолчанию, HTML-поле
должно называться _csrf_token, а строка, используемая для генерирования значения,
должна быть authenticate:

Затем вы защитите форму входа в систему от CSRF-атак.

Брандмауэр¶

Раздел firewalls в config/packages/security.yaml – это самый важный
раздел. “Брандмауэер” – это ваша система аутентификации: брандмауэр определяет,
какие части вашего приложения защищены, и как ваши пользователи будут проходить
аутентификацию (например, форма входа, API-токен и т.д.).

По одному запросу активен только один брандмауэр: Symfony использует ключ
pattern, чтобы найти первое совпадение (вы также можете
искать совпадения по хостингу или другим вещам).

Брандмауэр dev на самом деле ненастоящий: он гарантирует, что вы случайно не
заболнируете инструменты разработки Symfony, который живут по URL вроде
/_profiler и /_wdt.

Все настоящие URL обрабатываются брандмауэром main (отсутствие ключа pattern
означает, что совпадают dct URL). Брандмауэр может иметь множество режимов аутентификации,
другими словами – множество способов задать вопрос “Ты кто?”.

Зачастую пользовател неизвестен (т.е. не выполнил вход в систему), когда он
впервые попадает на ваш сайт. Если вы посетите свою домашнюю страницу прямо
сейчас, у вас будет доступ, и вы увидите, что вы посещаете страницу за брандмауэром
в панели инструментов:

_images/anonymous_wdt.png

Посвещение URL под другим брандмауэром не обязательно требует вашей аутентификации
(например, форма входа должна быть доступна, или некоторые части вашего приложения
публичны). Вы узнаете как ограничить доступ по URL, контроллерам или чему-либо еще
в вашем брандмауэере в разделе контроль доступа section.

Теперь, когда мы понимаем наш брандмауэр, следующий шаг – создать способ
аутентификации ваших пользователей!

Вход json¶

Некоторые приложения предоставляют API, защищенный с помощью токенов. Такие
приложения могут использовать конечную точку, предоставляющую эти токены,
основываясь на имени пользователя (или почте) и пароле. Аутентификатор входа
JSON помогает вам фнукционально создвать это.

Активируйте айтентики с помощью json_login:

Аутентификатор запускается, когда клиент запрашивает check_path. Для начала,
создайте контроллер для этого пути:

Этот контроллер входа будет вызван после того, как аутентификатор успешно
аутентифицирует пользователя. Вы можете получить аутентифицированного пользователя,
сгенерировать токен (или то, что вам надо вернуть) и вернуть JSON-ответ:

Это все!Мы суммируем процесс:

Выход из системы¶

Чтобы включить выход из системы, активируйте параметр конфигурации logout
под вашим брандмауэром:

Затем, без добавления контроллера, вы создаете маршрут для этого URL:

Вот и все! Отправив пользователя по маршруту app_logout (т.е. к /logout),
Symfony де-аутентифицирует текущего пользователя и перенаправит его.

Настройка выхода¶

New in version 5.1: LogoutEvent было представлено в Symfony 5.1. До этой версии, вам нужно
было использовать обработчик успешного выхода,
чтобы настроить выход из системы.

В некоторых случаях вам нужно будет выполнить дополнительную логику после выхода
из системы (например, инвалидировать некоторые токены), или вам может захотеться
настроить то, что происходит после выхода. Во время выхода из системы, запускается
LogoutEvent. Зарегистрируйте
слушателя или подписчика событий, чтобы выполнять
пользовательскую логику. Следующая информация доступна в классе события:

getToken()
Вовзвращает токен безопасности, который вот-вот выйдет из системы.
getRequest()
Возвращает текущий запрос.
getResponse()
Возвращает ответ, если он уже установлен пользовательским слушателем.
Используйте setResponse(), чтобы сконфигурировать пользовательский ответ
выхода.

Иерархичные роли¶

Вместо предоставления каждому пользователю множества ролей, вы можете определить
правила наследования, создав иерархию ролей:

Контроль доступа (авторизация)¶

Теперь пользователи могут выполнять вход в ваше приложения, используя форму входа. Отлично!
Далее, вам нужно узнать, как отказывать в доступе и работать с объектом Пользователя. Это
называется авторизация, и ее работа – решить, может ли пользователь получить доступ к
какому-то источнику (URL, объекту model, методу вызова, …).

Элементы авторизации имеют две стороны:

Настройка выхода¶

https://www.youtube.com/watch?v=rJ8nIS2VzQE

New in version 5.1: LogoutEvent было представлено в Symfony 5.1. До этой версии, вам нужно
было использовать обработчик успешного выхода,
чтобы настроить выход из системы.

В некоторых случаях вам нужно будет выполнить дополнительную логику после выхода
из системы (например, инвалидировать некоторые токены), или вам может захотеться
настроить то, что происходит после выхода. Во время выхода из системы, запускается
LogoutEvent.

getToken()
Вовзвращает токен безопасности, который вот-вот выйдет из системы.
getRequest()
Возвращает текущий запрос.
getResponse()
Возвращает ответ, если он уже установлен пользовательским слушателем.
Используйте setResponse(), чтобы сконфигурировать пользовательский ответ
выхода.

Ограничение попыток входа¶

Управление вводом – это новая функция Symfony 5.2.

Symfony предоставляет базовую защиту от атак входа грубой силы.
Вы должны включить ее, используя настройку login_throttling:

New in version 5.3: Опция login_throttling.interval была представлена в Symfony 5.3.

Регистрация пользователя: хеширование паролей¶

Множество приложений требуют входа в систему с помощью пароля. Для таких
приложений SecurityBundle предоставляет хеширование паролей и верификацию
функциональности.

Сертификаты клиентов x.509¶

При использовании сертификатов клиентов, ваш веб-сервер делает всю аутентификацию
сам. Аутентификатор X.509, предоставленный Symfony, извлекает почту из
“уникального имени” (DN) сертификата клиента. Затем, он использует эту почту в
качестве идентификатора пользователя в поставщике пользователей.

Для начала, сконфигурируйте ваш веб-сервер, чтобы подключить верификацию сертификатов
клиентов, и показать DN сертификатов приложению Symfony:

После этого включите аутентификатор X.509 и скопируйте его у себя:

Symfony использует две технологии для извлечения адреса из DN:

  1. В начале, она пробует параметр сервера SSL_CLIENT_S_DN_Email, который
    обнажен с помощью Apache;
  2. Если он не установлен (например, при использовании Nginx), она использует SSL_CLIENT_S_DN,
    и сопоставляет значение следующего emailAddress=.

События аутентификации¶

CheckPassportEvent
Запускается после того, как аутентификатор создал паспорт безопасности.
Слушатели этого события проводят реальные проверки аутентификации (вроде проверки
паспорта, валидации CSRF-токена и т.д.)
AuthenticationTokenCreatedEvent
Запускается после валидации паспорта и того, как аутентификатор создал токен
безопасности (и пользователя). Это может быть использовано в продвинутых
случаях применения, где вам нужно изменять созданный токен (например, для
мульти-факторной аутентификации).
AuthenticationSuccessEvent
Запускается когда аутентификация приближается к успеху. Это последнее событие,
которое может привести к неудачной аутентификации, вызвав AuthenticationException.
LoginSuccessEvent
Вызывается после того, как аутентификация была полностью успешна. Слушатели этого
события могут изменять ответ, отправленный пользователю.
LoginFailureEvent
Запускается после вызова AuthenticationException во время аутентификации.
Слушатели этого события изменяют ответ ошибки и отправляют его обратно пользователю.

События безопасности¶

Во время процесса аутентификации, запускаются несколько событий, которые позволяют
вам подключаться к процессу или настраивать отправленные пользователю ответы. Вы
можете сделать это, создав для таких событий слушателя или подписчика событий.

События аутентификации¶

CheckPassportEvent
Запускается после того, как аутентификатор создал паспорт безопасности.
Слушатели этого события проводят реальные проверки аутентификации (вроде проверки
паспорта, валидации CSRF-токена и т.д.)
AuthenticationTokenCreatedEvent
Запускается после валидации паспорта и того, как аутентификатор создал токен
безопасности (и пользователя). Это может быть использовано в продвинутых
случаях применения, где вам нужно изменять созданный токен (например, для
мульти-факторной аутентификации).
AuthenticationSuccessEvent
Запускается когда аутентификация приближается к успеху. Это последнее событие,
которое может привести к неудачной аутентификации, вызвав AuthenticationException.
LoginSuccessEvent
Вызывается после того, как аутентификация была полностью успешна. Слушатели этого
события могут изменять ответ, отправленный пользователю.
LoginFailureEvent
Запускается после вызова AuthenticationException во время аутентификации.
Слушатели этого события изменяют ответ ошибки и отправляют его обратно пользователю.

Форма входа¶

Большинство сайтов имеют форму входа, где пользователи проходят
аутентификацию, используя идентификатор (например, адрес почты или
имя пользователя) и пароль. Этот функционал предоставлен аутентификатором
формы входа.

Для начала, создайте контроллер для входа:

Затем, включите аутентификатор формы входа:

После подключения, система безопасности перенаправляет неаутентифицированных посетителей
на login_path, если они пробуют попасть в защищенное место (это поведение можно настроить,
используя точки входа аутентификации).

Измените контроллер входа, чтобы отобразить форму входа

Не позволяйте этому контроллеру запутать вас. Его работа только отображать форму:
аутентификатор form_login позаботится об отправке формы автоматически.

Если
пользовател отправляет невалидный адрес почты или пароль, этот аутентификатор сохранит
ошибку и перенаправит обратно к этому контроллеру, где мы прочтем ошибку (используя
AuthenticationUtils), чтобы она могла быть отражена пользователю.

Наконец, сделайте или обновите шаблон:

Форма может быть любой, но, как правило, она соответствует следующим правилам:

Похожее:  Аутентификация с модулем requests в Python.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *