Zend 2 身份验证:管理 2 个身份
Zend 2 Authentication : Manage 2 Identities
我正在使用 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
}
有什么想法吗?谢谢。
如果您使用的是 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();
另一种方法是创建 2 个身份验证服务,一个用于电子邮件,另一个用于用户名。
当用户提交登录时,检查其电子邮件是否有效。在这种情况下,请使用电子邮件身份验证服务。否则,选择用户名认证服务。
开始,您可以使用 zend 电子邮件验证器检查它是否是有效的电子邮件
$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
}
我正在使用 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
}
有什么想法吗?谢谢。
如果您使用的是 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();
另一种方法是创建 2 个身份验证服务,一个用于电子邮件,另一个用于用户名。
当用户提交登录时,检查其电子邮件是否有效。在这种情况下,请使用电子邮件身份验证服务。否则,选择用户名认证服务。
开始,您可以使用 zend 电子邮件验证器检查它是否是有效的电子邮件$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
}