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 website

开始,您可以使用 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
}