可以散列或原始的密码值对象



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

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

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

namespace ModelsValuesUser;
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;
    }
}

我同意@kingkero在上面的评论:让这两个不同的类。

我建议HashedPassword只能通过Password上的工厂方法创建(可能使用作为参数的PasswordHashAlgorithm服务(,在Password验证输入后,该方法将用于创建哈希密码。仅持久化HashedPassword

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

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

所以我认为你检查密码强度已经太晚了,除非你能早点检查。

相关内容

  • 没有找到相关文章

最新更新