我有一个 LoginController 类,如:
class LoginController
{
protected $db;
public function __construct(PDO $db)
{
$this->db = $db;
}
public function login($username, $password)
{
//Query the database, and get back the password_hash, salt, and user id.
//Hash the incoming password with the salt.
//Compare the two hashes.
//return the logged in user object.
}
}
因此,在从数据库中检索 password_hash 和 salt 之后,我需要对传入的密码进行哈希处理。在我看来,这似乎是应该由另一个组件处理的第二个责任。也许是一个 PasswordHashingComponent(或者如果你有一个更好的名字)。
abstract class PasswordHashingComponentAbstract
{
public abstract function hash($data, $salt = "");
public function verify($hash, $data, $salt = "")
{
return $this->hash($data, $salt) == $hash;
}
}
class MD5PasswordHashingComponent extends PasswordHashingComponentAbstract
{
public function hash($data, $salt = "")
{
return md5($data . md5($salt));
}
}
class SHA1PasswordHashingComponent extends PasswordHashingComponentAbstract
{
public function hash($data, $salt = "")
{
return sha1($data . sha1($salt));
}
}
然后我可以依赖注入到 LoginController 中:
public function __construct(PDO $db, PasswordHashingComponentAbstract $passwordhasher);
和
$loginController = new LoginController($db, new SHA1PasswordHashingComponent());
$loginController->login("username", "password");
所以我的问题是这是否是矫枉过正。
如果我的 LoginController 同时处理登录以及如何对密码进行哈希和比较,这是否是严重的 SRP 违规?
在我看来,这个类可能会改变有两个原因:
- 如果处理登录的方式发生变化。
- 如果密码被散列和比较的方式发生了变化。
那么,这不违反 SRP 吗?有没有更好的方法可以处理抽象出密码散列部分?
谢谢!