我正在使用zend 2身份验证。现在有一种情况是用户可以使用用户名和密码或电子邮件和密码登录。是否可以在zend 2中同时提供用户名和电子邮件作为身份。否则,我该如何处理这种情况?
这是我目前的工作代码。这里使用电子邮件作为身份和密码作为凭证。
在Module.php中
public function getServiceConfig()
{
return array(
'factories' => array(
'AuthService' => function($sm) {
$dbTableAuthAdapter = new DbTableAuthAdapter(
$sm->get('Zend\Db\Adapter\Adapter'),
'users',
'email',
'password'
);
$authService = new AuthenticationService();
$authService->setAdapter($dbTableAuthAdapter);
return $authService;
},
)
);
}
并在控制器中,
$this->getAuthService()->getAdapter()->setIdentity($oRequest->getPost('username'))->setCredential(md5($oRequest->getPost('password')));
$select = $this->getAuthService()->getAdapter()->getDbSelect();
$select->where('is_active = 1');
$oResult = $this->getAuthService()->authenticate();
// Authentication ends here
if ($oResult->isValid()) {
// code after authentication
}
有什么想法吗?谢谢。
答案 0 :(得分:1)
如果你正在使用Zend \ Authentication \ Adapter \ DbTable适配器,也许你可以尝试这样的事情:
$this->getAuthService()->getAdapter()
->setIdentity($oRequest->getPost('username'))
->setCredential(md5($oRequest->getPost('password')));
$select = $this->getAuthService()->getAdapter()->getDbSelect();
$select->where('is_active = 1');
$oResult = $this->getAuthService()->authenticate();
if (!$oResult->isValid()) { //authentication by username failed, try with email
$this->getAuthService()->getAdapter()->setIdentityColumn('email')
->setIdentity($oRequest->getPost('email'))
->setCredential(md5($oRequest->getPost('password')));
$oResult = $this->getAuthService()->authenticate();
}
return $oResult->isValid();
答案 1 :(得分:0)
另一种方法是创建2个身份验证服务,一个用于电子邮件,另一个用于用户名。
当用户提交登录时检查其是否是有效的电子邮件。在这种情况下,请使用电子邮件验证服务。否则,请选择用户名验证服务。
您可以从Zend website
检查其是否是包含zend email validator的有效电子邮件$validator = new Zend\Validator\EmailAddress();
if ($validator->isValid($login)) {
// email appears to be valid
// Use email authentication service
} else {
// email is invalid; It may be the username.
// use username authentication service
}