所以我使用Zend_Auth来验证我网站的用户。目前他们只能使用他们的电子邮件登录登录,但我想让他们也使用他们的用户名登录。
以下是一些代码:
// prepare adapter for Zend_Auth
$adapter = new Zend_Auth_Adapter_DbTable($this->_getDb());
$adapter->setTableName('users');
$adapter->setIdentityColumn('email');
$adapter->setCredentialColumn('password_hash');
$adapter->setCredentialTreatment('CONCAT(SUBSTRING(password_hash, 1, 40), SHA1(CONCAT(SUBSTRING(password_hash, 1, 40), ?)))');
$adapter->setIdentity($request->getParam('email'));
$adapter->setCredential($request->getParam('password'));
注意这一行:
$adapter->setIdentityColumn('email');
如何在那里添加用户名(数据库中名为username的列)?
更新:
这就是我解决这个问题的方法:
$login = $request->getParam('email');
$validator = new Zend_Validate_EmailAddress();
if (false === $validator->isValid($login)) {
$u = $this->_getTable('Users')->getSingleWithUsername($login);
if (null === $u) {
throw new Exception ('Invalid login and/or password');
}
$login = $u->email;
}
// prepare adapter for Zend_Auth
$adapter = new Zend_Auth_Adapter_DbTable($this->_getDb());
$adapter->setTableName('users');
$adapter->setIdentityColumn('email');
$adapter->setCredentialColumn('password_hash');
$adapter->setCredentialTreatment('CONCAT(SUBSTRING(password_hash, 1, 40), SHA1(CONCAT(SUBSTRING(password_hash, 1, 40), ?)))');
$adapter->setIdentity($login);
$adapter->setCredential($request->getParam('password'));
答案 0 :(得分:5)
我处理同样的事情,我在Zend_Auth之前处理它。我使用单个用户登录字段,首先检查它是否是电子邮件地址 - 如果是,则转换为相应的用户名。然后,让Zend_Auth做它的事。
这对我很有用,虽然你需要切换它,因为你会走另一条路。
i。在您的用户登录字段中添加过滤器,如下所示:
$user_field->addFilter('EmailToUsername');
ii。过滤器:
<?php
/**
* Converts an email address to the username.
*/
class Prontiso_Filter_EmailToUsername implements Zend_Filter_Interface
{
public function filter( $value )
{
if ( Zend_Validate::is($value, 'EmailAddress') ) {
$user_table = new Users();
$user = $user_table->findByEmail($value);
if ( $user ) {
return $user->username;
}
}
/**
* Nothing happened, so don't filter.
*/
return $value;
}
}
至于仅更改Zend_Auth
设置,Zend_Auth
不喜欢任何/或标识列,因此您必须编写自己的身份验证适配器。
答案 1 :(得分:3)
我自己的解决方案:
$adapter->setIdentityColumn(stripos($indentity, '@') ? 'email' : 'username');
快速而简单!