Как проверить пароль пользователя, созданного с помощью диспетчера пользователей?

Я хочу знать, как проверить произвольный пароль на соответствие правилам проверки, определенным в validation.xml. Я создал страницу администратора, где пользователи-администраторы могут создавать других пользователей-администраторов. Я хочу проверить этих пользователей, используя те же правила, которые используются, когда анонимные пользователи регистрируются для своей учетной записи на странице /register. Насколько я вижу, эти правила определены в validation.xml.

Итак, в основном я хочу сделать что-то вроде этого:

$userManager = $container->get('fos_user.user_manager');
$user = $userManager->createUser();
$user->setPlainPassword('1');
$arrayOfErrors = functionThatValidatesUserPassword($user);

или даже вызвать функцию для пароля напрямую следующим образом:

$arrayOfErrors = functionThatValidatesUserPassword('1');

Что мне следует использовать вместо functionThatValidatesUserPassword здесь?

Я думал, что служба проверки может работать, но когда я пытаюсь

$validator = $this->get('validator');
$errors = $validator->validate($user);
print_r($errors);exit;

Я просто получаю пустой список ошибок. Я ожидал увидеть сообщение об ошибке «Слишком короткий пароль», которое вы получите, если зарегистрируете учетную запись с тем же паролем на странице /register.

Я использую Symfony 3.4 и FosUserBundle 2.0.


В поисках ответов на свой вопрос я нашел следующие два сообщения, описывающие, как переопределить правила, определенные в файле validation.xml.

Я планирую переопределить правила проверки, но сейчас я просто хочу проверить свой пароль, используя встроенные правила, которые поставляются с FosUserBundle.


person Cave Johnson    schedule 06.12.2017    source источник
comment
@bangbambang Да, это правильно, используя правила, которые я создаю в пользовательском файле validation.xml.   -  person Cave Johnson    schedule 06.12.2017
comment
Извините, заснул и случайно удалил свой последний комментарий. Предполагая, что createUser() возвращает Entity, служба проверки должна работать. Какой версией СФ пользуетесь?   -  person bangbambang    schedule 06.12.2017
comment
@bangbambang Symfony 3.4, FosUserBundle 2.0   -  person Cave Johnson    schedule 06.12.2017
comment
Я никогда широко не использовал FOSUserBundle, поэтому могу ошибаться. Но пробовали ли вы инициировать проверку, вызвав $userManager->updatePassword($user)?   -  person bangbambang    schedule 06.12.2017
comment
@bangbambang Извините, мне пришлось ненадолго уйти. Вы предлагаете мне сделать это до того, как я сделаю $validator->validate($user)?   -  person Cave Johnson    schedule 07.12.2017
comment
Согласно symfony.com/doc/current/bundles/FOSUserBundle/user_manager.html по умолчанию сбрасывается... при вызове метода updateUser. Вы можете отключить сброс, передав второй аргумент со значением false. Тогда это будет эквивалентно вызову updateCanonicalFields и updatePassword. Таким образом, любой вызов updateUser($user, false) или updatePassword($user) должен запускать базовые прослушиватели без сброса UoW (просто на всякий случай). Опять же, я никогда не использовал FosUserBundle широко, и у меня нет времени на настройку тестового проекта, так что это просто предположение.   -  person bangbambang    schedule 07.12.2017
comment
с той же страницы Для упрощения в комплект поставки входит слушатель Doctrine, который за кулисами обрабатывает обновление пароля и канонических полей. ... Извините, это все, что я мог сделать, чтобы помочь. Возможно, вернусь позже, если мне удастся проверить (и этот вопрос все еще остается без ответа). Поскольку длительное обсуждение в комментариях не рекомендуется, возможно, вы получите более быстрый ответ, чтобы задать вопрос в SO chat/slack/github.   -  person bangbambang    schedule 07.12.2017
comment
@bangbambang Большое спасибо за вашу помощь. Мне удалось решить мою проблему. Проблема заключалась в том, что правила принадлежат группам проверки, поэтому мне нужно передать группу, которую я хочу проверить, в необязательный третий параметр функции проверки.   -  person Cave Johnson    schedule 07.12.2017


Ответы (1)


Я нашел ответ на свою проблему. Ограничения во встроенном файле validation.xml FOSUserBundle принадлежат группам проверки. По умолчанию функция validate проверяет только те ограничения, которые не принадлежат ни к одной группе. У функции validate есть третий параметр, который принимает массив групп, содержащих ограничения, которые вы хотите проверить. Поэтому все, что вам нужно сделать, это передать группы, содержащие ограничения, которые вы хотите проверить. Например, поле пароля относится к следующим группам: Registration, Profile, ResetPassword, ChangePassword. Я использовал группу Registration, поэтому мой код выглядит так:

$userManager = $this->get('fos_user.user_manager');
$user = $userManager->createUser();
$user->setPlainPassword('1');
$validator = $this->get('validator', null, array("Registration"));
$errors = $validator->validate($user);
person Cave Johnson    schedule 07.12.2017