我正在将旧的 CakePHP (1.3.13) 应用程序移植到 ZF2。在 ZF2 应用程序中,我使用 ZfcUser 进行身份验证和注册。但是,Cake 应用程序有一个带有散列密码的现有用户群,我想导入这些密码,这样在新应用程序上线后,并不是每个用户都必须重置他们的密码。
我弄清楚了旧应用程序中的密码是如何散列的。它是附加到盐的密码的 SHA1 哈希。我实现了一个自定义身份验证适配器,它扩展了 ZfcUser 的 Db 适配器 (ZfcUser\Authentication\Adapter\Db)。这个自定义适配器有一个加密策略作为成员变量:
class CustomEncryptionStrategyAdapter extends Db
{
/**
* @var EncryptionStrategyInterface
*/
protected $encryptionStrategy;
public function __construct(EncryptionStrategyInterface $encryptionStrategy)
{
$this->encryptionStrategy = $encryptionStrategy;
}
[...]
我覆盖了 CustomEncryptionStrategyAdapter 中的身份验证方法:
public function authenticate(AuthEvent $e)
{
[...]
if ($this->getEncryptionStrategy()->encryptPassword($credential) != $userObject->getPassword())
{
// Password does not match
$e->setCode(AuthenticationResult::FAILURE_CREDENTIAL_INVALID)
->setMessages(array('Supplied credential is invalid.'));
$this->setSatisfied(false);
return false;
}
[...]
在我的 zfcuser.global 配置中,我添加了自定义适配器,因此它首先使用该适配器,如果它不起作用,则使用默认适配器:
'auth_adapters' => array(
120 => 'RedevUser\Authentication\Adapter\CustomEncryptionStrategyAdapter',
100 => 'ZfcUser\Authentication\Adapter\Db'
),
在这种情况下,首先调用自定义身份验证适配器,如果失败,它会调用默认的 ZfcUser Db 适配器。但是,即使自定义适配器成功验证并在 AuthEvent 对象和会话存储 (setSatisfied(true)) 中设置此信息,仍会调用 Db 适配器,并且当然会失败。
如果我在 zfcuser.global 配置中禁用默认 Db 适配器,那么它适用于旧用户帐户。但这不是我想要的,因为我希望新注册的用户使用默认的 Bcrypt 加密。任何想法为什么在第一个适配器中成功验证后它仍然继续在第二个适配器中调用验证方法?或者这是 ChainableAdapter 接口的预期行为?