密码值对象,可以是哈希值或原始值

时间:2014-08-06 20:32:51

标签: php validation hash domain-driven-design value-objects

我有以下价值对象(VO)Password。密码必须介于6到20个字符之间。但是由于我的UserMapper在持久化实体之前对密码进行了哈希处理,所以我不知道在这个VO中应该有什么验证逻辑。

UserMapper返回User时,密码为散列形式,长度为60个字符。

这是否意味着我必须在我的价值对象中考虑这两种情况?目前它会抛出InvalidArgumentException异常,因为该值不会介于6到20个字符之间,而是长度为60个字符(散列)。

namespace Models\Values\User;

use \InvalidArgumentException;

class Password
{
    private $min = 6;
    private $max = 20;

    private $password;

    public function __construct($password)
    {
        if (is_string($password) && !empty($password)) {
            $length = $this->stringLength($password);

            if ($length >= $this->min && $length <= $this->max) {
                $this->password = $password;
            }
        } else {
            throw new InvalidArgumentException(sprintf('%s must be a string from %s to %s characters.', __METHOD__, $this->min, $this->max));
        }
    }

    public function __toString()
    {
        return $this->password;
    }

    private function stringLength($string)
    {
        $encoding = mb_detect_encoding($string);
        $length   = mb_strlen($string, $encoding);

        return $length;
    }
}

2 个答案:

答案 0 :(得分:2)

我同意上述评论中的@kingkero:制作两个不同的类。

我建议HashedPassword只能通过Password上的工厂方法创建(可能使用作为参数提供的PasswordHashAlgorithm服务),这将用于创建哈希密码Password验证了输入。只保留HashedPassword个。

答案 1 :(得分:0)

长度上的客户端密码验证可以在包含密码字符串项的文本框上。 之后,它应被视为安全密码(如果密码存储区接受它)。

之后,您不应该从密码存储设置或获取密码,而是要求商店为您验证密码。

所以我认为你在检查密码强度方面为时已晚,除非你能早点做到。