我得到了以下值对象(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
。
客户端密码长度验证可以在包含密码字符串项的文本框上进行。之后,它应该被认为是一个安全的密码(如果密码存储接受它(。
之后,您不应该从密码存储中设置或获取密码,而是要求存储为您验证密码。
所以我认为你检查密码强度已经太晚了,除非你能早点检查。