php auth 表,php – Zend_Auth:允许用户登录到多个表/身份

您应该创建自己的Zend_Auth_Adapter.此适配器将尝试针对您的三个资源进行身份验证,并将其标记在专用成员变量中,以便您可以知道哪些登录尝试被强制验证.

要创建您的认证适配器,您可以作为Zend_Auth_Adapter_DbTable的基础.

因此,在__construct中,而不是仅传递一个DbTable适配器,您可以传递每个资源中使用的三个适配器.只有当每个人使用不同的资源(例如LDAP)或甚至另一个数据库时,您才能以这种方式执行,否则,您只能传递一个适配器,并在配置选项中设置三个不同的表名.

以下是Zend_Auth_Adapter_DbTable的示例:

/**

* __construct() - Sets configuration options

*

* @param Zend_Db_Adapter_Abstract $zendDb

* @param string $tableName

* @param string $identityColumn

* @param string $credentialColumn

* @param string $credentialTreatment

* @return void

*/

public function __construct(Zend_Db_Adapter_Abstract $zendDb, $tableName = null, $identityColumn = null,

$credentialColumn = null, $credentialTreatment = null)

{

$this->_zendDb = $zendDb;

// Here you can set three table names instead of one

if (null !== $tableName) {

$this->setTableName($tableName);

}

if (null !== $identityColumn) {

$this->setIdentityColumn($identityColumn);

}

if (null !== $credentialColumn) {

$this->setCredentialColumn($credentialColumn);

}

if (null !== $credentialTreatment) {

$this->setCredentialTreatment($credentialTreatment);

}

}

从Zend_Auth_Adapter_DbTable的方法,尝试对一个表进行身份验证,您可以将其更改为在三个表中尝试,而对于每个表,您可以将其设置为私有成员变量中的标志.像$result [‘group1’] = 1;您将为每次成功登录尝试设置1.

/**

* authenticate() - defined by Zend_Auth_Adapter_Interface. This method is called to

* attempt an authentication. Previous to this call, this adapter would have already

* been configured with all necessary information to successfully connect to a database

* table and attempt to find a record matching the provided identity.

*

* @throws Zend_Auth_Adapter_Exception if answering the authentication query is impossible

* @return Zend_Auth_Result

*/

public function authenticate()

{

$this->_authenticateSetup();

$dbSelect = $this->_authenticateCreateSelect();

$resultIdentities = $this->_authenticateQuerySelect($dbSelect);

if ( ($authResult = $this->_authenticateValidateResultset($resultIdentities)) instanceof Zend_Auth_Result) {

return $authResult;

}

$authResult = $this->_authenticateValidateResult(array_shift($resultIdentities));

return $authResult;

}

只有三次登录尝试之一被成功验证,您才会返回一个有效的$authresult.

现在,在您的控制器中,尝试登录后:

public function loginAction()

{

$form = new Admin_Form_Login();

if($this->getRequest()->isPost())

{

$formData = $this->_request->getPost();

if($form->isValid($formData))

{

$authAdapter = $this->getAuthAdapter();

$authAdapter->setIdentity($form->getValue('user'))

->setCredential($form->getValue('password'));

$result = $authAdapter->authenticate();

if($result->isValid())

{

$identity = $authAdapter->getResult();

Zend_Auth::getInstance()->getStorage()->write($identity);

// redirect here

}

}

}

$this->view->form = $form;

}

private function getAuthAdapter()

{

$authAdapter = new MyAuthAdapter(Zend_Db_Table::getDefaultAdapter());

// Here the three tables

$authAdapter->setTableName(array('users','users2','users3'))

->setIdentityColumn('user')

->setCredentialColumn('password')

->setCredentialTreatment('MD5(?)');

return $authAdapter;

}

这里的关键是下面的行,这将在您的自定义验证适配器中实现:

$identity = $authAdapter->getResult();

您可以将此表单作为基础Zend_Auth_Adapter_DbTable:

/**

* getResultRowObject() - Returns the result row as a stdClass object

*

* @param string|array $returnColumns

* @param string|array $omitColumns

* @return stdClass|boolean

*/

public function getResultRowObject($returnColumns = null, $omitColumns = null)

{

// ...

}

当成功进行身份验证时,这将返回登录尝试中匹配的行.

因此,您将创建可返回此行的$getResult()方法以及$this-> result [‘groupX’]标志.

就像是:

public function authenticate()

{

// Perform the query for table 1 here and if ok:

$this->result = $row->toArrray(); // Here you can get the table result of just one table or even merge all in one array if necessary

$this->result['group1'] = 1;

// and so on...

$this->result['group2'] = 1;

// ...

$this->result['group3'] = 1;

// Else you will set all to 0 and return a fail result

}

public function getResult()

{

return $this->result;

}

毕竟,您可以使用Zend_Acl控制您的视图和其他操作.由于您将拥有Zend Auth Storage中的标志,因此您可以使用作为角色:

$this->addRole(new Zend_Acl_Role($row['group1']));

这里有一些资源:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值