您应该如何验证密码设置器的输入?

gvi*_*iew 2 php validation symfony

我一直在寻找我的Symfony2验证选项.问题是这样的:

我有一个在setPassword方法中哈希密码的Member类:

public function setPassword($password)
{
    $this->password = Encrypt::cryptPassword($password);
}
Run Code Online (Sandbox Code Playgroud)

散列是一个长字符串,无论原始输入如何都存在.

出于这个原因,这样的验证是无用的:

 * @Assert\NotBlank()
 * @Assert\Length(
 *      min = "8",
 *      max = "15",
 *      minMessage = "Your password must be at least {{ limit }} characters",
 *      maxMessage = "Your password cannot be longer than {{ limit }} characters"
 * ) 
Run Code Online (Sandbox Code Playgroud)

触发验证是因为无论输入的有效性如何都会创建哈希字符串.

我看了尝试getter验证,但这似乎也是一个死路一条,因为我真正想要验证的是setPassword()的原始输入,并且在setPassword创建了一个hash值之后得到了hash值很有帮助.

推荐的方法是什么,它与现有的Validation组件一起使用,可以让我验证原始用户输入?

更新

虽然我接受了答案,但它并不可行.它确实让我专注于生命周期回调系统,这可能是解决方案的一部分.

根据当前的建议,一旦第一次对密码进行编码,每次尝试编辑实体时都会超过验证,因为散列密码当然不是输入,也不能解密为原始输入.

我现在正在试验实体中的单独属性,纯粹是为了输入密码,以及使用验证组来触发在某些情况下使用验证(新用户创建/密码更改),而在其他情况下省略它案例.我计划使用prePersist和preUpdate回调来进行密码编码.

仅供记录,这是在提供REST API的应用程序中使用,以及管理工具和所选功能的Web前端.

Syb*_*bio 12

使用doctrine lifecycles,永远不要修改setter的行为!

<?php

// ...

/**
 * @ORM\Entity()
 * @ORM\HasLifecycleCallbacks()
 */
class Member
{
    public function setPassword($password)
    {
        $this->password = $password;
    }

    /**
     * @ORM\PrePersist
     *
     * First time you save the entity
     */
    public function prePersist()
    {
        $this->password = Encrypt::cryptPassword($this->password);
    }
}
Run Code Online (Sandbox Code Playgroud)

在此示例中,在保存成员对象之前,密码不会被编码,因此可以通过断言进行验证!

但是,Symfony2安全性附带了一个防火墙,可以加密成员的密码,只需为您完成工作:

http://symfony.com/doc/current/book/security.html#encoding-the-user-s-password