Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
正在验证Symfony2中的密码_Symfony - Fatal编程技术网

正在验证Symfony2中的密码

正在验证Symfony2中的密码,symfony,Symfony,我正在尝试在Symfony2中设置一个更改密码的功能。我有一个“当前密码”字段、一个“新密码”字段和一个“确认新密码”字段,我目前关注的部分是验证“当前密码”字段 (顺便说一句,我现在意识到像FOSUserBundle这样的东西已经存在,它们可以为我解决很多问题,但我已经基于官方Symfony文档构建了我的身份验证系统,我现在没有时间重做所有的身份验证代码。) 我想象/希望我能做的是创建一个验证回调,它会这样说: // Entity/User.php public function curre

我正在尝试在Symfony2中设置一个更改密码的功能。我有一个“当前密码”字段、一个“新密码”字段和一个“确认新密码”字段,我目前关注的部分是验证“当前密码”字段

(顺便说一句,我现在意识到像
FOSUserBundle
这样的东西已经存在,它们可以为我解决很多问题,但我已经基于官方Symfony文档构建了我的身份验证系统,我现在没有时间重做所有的身份验证代码。)

我想象/希望我能做的是创建一个验证回调,它会这样说:

// Entity/User.php

public function currentPasswordIsValid(ExecutionContext $context)
{
  $currentPassword = $whatever; // whatever the user submitted as their current password
  $factory = $this->get('security.encoder_factory'); // Getting the factory this way doesn't work in this context.
  $encoder = $factory->getEncoder($this);
  $encryptedCurrentPassword = $encoder->encodePassword($this->getPassword(), $this->getSalt());

  if ($encyptedCurrentPassword != $this->getPassword() {
    $context->addViolation('Current password is not valid', array(), null);
  }
}
正如您在我的评论中所看到的,上面的代码不起作用至少有几个原因。我只想就这些特定的问题提出一些具体的问题,但也许我找错了方向。这就是为什么我要问整个问题


那么,如何验证用户的密码呢?

FOSUserBundle
使用了一个独立于基本类的
ModelManager
类。您可以查看他们的。

自Symfony 2.1以来,就有了一个解决方案


首先,您应该创建一个。您可以将验证器注册为服务,并在其中注入所需的任何内容

第二,由于您可能不想将当前密码的字段添加到User类中只是为了将约束粘贴到该类中,因此可以使用所谓的。本质上,您可以在
Form\Model
命名空间中创建一个类,该类保存当前密码字段和对用户对象的引用。然后,您可以将自定义约束粘贴到该密码字段。然后根据此表单模型创建密码更改表单类型

下面是我的一个项目的约束示例:


我最终解决了这个棘手的问题。我绕过了Symfony的所有表单内容,并完成了控制器中的所有逻辑。

在Symfony 2.1中,您可以使用内置验证程序:

例如,在表单生成器中:

// declare
use Symfony\Component\Security\Core\Validator\Constraints\UserPassword;

// mapped=>false (new in 2.1) is to let the builder know this is not an entity field
->add('currentpassword', 'password', array('label'=>'Current password', 'mapped' => false, 'constraints' => new UserPassword()))
显然,验证器现在有一个bug,所以现在可能会工作

好的,谢谢。但是实际的密码验证部分呢?这就是我的问题所在。我已经知道如何创建自定义验证器以及如何创建表单字段。我在连接上遇到了一些问题。为我的子问题开始了一个单独的问题:
@Validator
注释是否应该使
用户
类知道使用这个验证器?如果没有,那部分是怎样的?谢谢。它允许您在任何类上使用约束作为注释。此验证程序中没有任何内容将其仅限于
用户
类。好的,那么我如何告诉
用户
类使用
CustomPasswordValidator
?您应该使用新的UserPassword验证约束重试。注意,有一个输入错误,它应该是
Symfony\Component\Security\Core\Validator\Constraints\UserPassword
(合同中缺少
s