Я реализовал в Symfony Custom User Checker, следуя этому руководству . Мне нужно выполнить дополнительную проверку, чтобы определить, активна ли учетная запись, пытающаяся войти в систему.
Вот мой код проверки пользователя:
class UserChecker implements UserCheckerInterface {
public function checkPreAuth(UserInterface $user) {
if (!$user->getUser()->getIsActive()) {
throw new DisabledException("Account is disabled.");
} else {
return;
}
}
public function checkPostAuth(UserInterface $user) {
return;
}
}
В этом случае объект $user
, который передается DI, является просто оболочкой (которая реализует UserInterface) моего объекта User. Мой пользовательский объект имеет флаг bool isActive
. если getIsActive
возвращает false, мое условие отрицает это, и оно должно выбросить DisabledException
.
Однако это не то поведение, которое я вижу. Если я вхожу в систему с активным пользователем, я могу войти в систему в порядке. Если я вхожу в систему с отключенным пользователем, он просто возвращает меня обратно на экран входа в систему (исключение не выдается).
Если я поменяю DisabledException
на просто Exception
, исключение выдается, но я не вижу места в своем коде, где я могу его перехватить, чтобы я мог показать красивое сообщение "аккаунт отключен" для пользователь над экраном входа в систему.
Я предполагаю, что Symfony ловит и глотает DisabledException
где-то.
Вот мой security.yaml
:
security:
providers:
db_provider:
id: database_user_provider
encoders:
App\Utility\Security\DatabaseUser: bcrypt
firewalls:
main:
pattern: ^/
form_login:
provider: db_provider
login_path: login
check_path: process_login
default_target_path: do_some_stuff
use_referer: true
user_checker: App\Utility\Security\UserChecker
anonymous: ~
logout:
path: logout
target: login
access_control:
- { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/register, roles: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/userRegister, roles: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/, roles: ROLE_USER }
У меня вопрос: где перехватывается это исключение / что мне нужно переопределить или реализовать, чтобы я мог передать сообщение пользователю?
или
Где я могу поймать Exception
, чтобы сделать то же самое?