Comments 12
Написать туториал решил после того, как не нашел подробной инструкции для данной задачи в английской документации, гайдах или обсуждениях, не говоря уже о материалах на русском языке.
Для решения таких задач нужны инструкции, пошаговые туториалы и надо гуглить? Просто сделать 2 формы авторизации?
Даже если мы сделаем вторую форму авторизации (т.е. другой route, а соответственно контроллер) — это не даст нам возможность использовать другую сущность.
Всё это настраивается в security.yaml — о чем документация подробно не рассказывает
Яркий пример — даже после настройки security.yaml как нужно, возникла проблема — в качестве логина передавался username, а мне необходимо было передавать email. Это решается параметром username_parameter — о чем нигде толком не написано ясно.
form_login:
login_path: /admin/login
check_path: /admin/login_check
default_target_path: /admin
username_parameter: email
password_parameter: password
use_referer: true
stackoverflow.com/questions/15366637/symfony-firewalls-multiple-login-forms
github.com/FriendsOfSymfony/FOSUserBundle/issues/849
Яркий пример
Вообще-то изменение username_parameter на email, это один из топовых вопросов в части авторизации.
Если Вам лень гуглить, есть еще такая хорошая команда config:dump-reference, например
./bin/console config:dump-reference security firewalls.name.form_login выводит кучу возможных параметров, список которых сразу должно наводить на определенные мысли человека, пытающегося юзать symfony, мягко скажем так…
form_login:
provider: ~
remember_me: true
success_handler: ~
failure_handler: ~
check_path: /login_check
use_forward: false
require_previous_session: false
login_path: /login
username_parameter: _username
password_parameter: _password
csrf_parameter: _csrf_token
csrf_token_id: authenticate
enable_csrf: false
post_only: true
always_use_default_target_path: false
default_target_path: /
target_path_parameter: _target_path
use_referer: false
failure_path: null
failure_forward: false
failure_path_parameter: _failure_path
csrf_token_generator: ~
Я ниже ответил подробно. Как раз из-за того, что вы смешали два способа реализации формы: форма сгенерированна под аутентификатор, а в итоге используется form_login, вам пришлось искать эти параметры.
symfony.com/doc/current/security.html
symfony.com/doc/current/security/form_login_setup.html
2. Повторяем по доке два раза
Можете дать ссылку на официальную документацию от Symfony или какой-нибудь туториал в интернете, где будет пошаговое описание как сделать две разные формы логина для двух разных сущностей, которые не связаны между собой?
В Symfony есть несколько способов реализовать форму входа:
Изначальный form_login. По сути требует от себя только небольшого конфига
form_login: login_path: login check_path: login
и собственно самой формы. К сожалению, шаг влево, шаг вправо — она уже не подойдет (хотя мне всегда хватало)
Аутентификация на базе symfony/security-guard. В этом случае у пользователя есть полный контроль над процессом, но требует от себя больше действий, а именно реализации интерфейса AuthenticatorInterface. Как раз этот способ предлагается в документации, т.к. используется
MakerBundle
и весь бойлерплейт можно переложить на кодогенерацию.
В вашем гайде используются оба подхода. Вы описываете создание аутентификаторов, но потом ни с того, ни с сего добавляете ключ form_login
в конфиг фаерволов. В итоге от команды make:auth
вы берете только форму логина, а сгенерированные аутентификаторы лежат мертвым грузом.
0 => [
'email' => 'admin@example.com',
'role' => ['ROLE_ADMIN'],
'password' => 123654
]
моветончиком балуемся =)))
[Symfony 5] Раздельная авторизация для админов и пользователей с двумя разными сущностями и формами входа