我正在尝试使用1.11框架链接这里遵循Zend Auth和Zend Acl教程!
我已经成功设置了身份验证,并且能够对Acl.php页面中给出的控制器::操作对使用身份验证。首先,我想测试用户表上的两个附加参数,即用户帐户是否被激活,以及在允许访问网站之前用户是否被管理员禁止。我如何在这段代码中实现它呢?
其次,我想知道如何将一个控制器下的所有操作包含到用户授权级别。也就是说,我有一个主控制器,它有许多动作在它的各种表。你能告诉我如何限制访问主控制器的所有动作管理角色。无需添加资源,并允许在Acl.php中为每个操作提供资源。也请告诉我这个逻辑是否可以扩展到允许访问整个模块,而不仅仅是控制器(通过一个添加资源和允许资源)?如果是,怎么做?
首先,我想在用户上测试两个附加参数表显示用户帐户是否被激活,以及用户是否被激活在允许访问网站之前被管理员禁止。
教程代码使用Zend_Auth_Adapter_DbTable
的普通版本,该版本使用特定的api进行身份验证。要使Zend_Auth按照您想要的方式工作并不困难,但需要一些思考,因为您需要实现Zend_Auth_Adapter_Interface
。听起来更糟糕,你只需要实现authenticate()
方法。下面是一个验证适配器的示例,可以用来代替Zend_Auth_Adapter_DbTable
:
<?php
//some code truncated for length and relevance
class My_Auth_Adapter implements Zend_Auth_Adapter_Interface
{
protected $identity = null;
protected $credential = null;
protected $usersMapper = null;
public function __construct($username, $password, My_Model_Mapper_Abstract $userMapper = null)
{
if (!is_null($userMapper)) {
$this->setMapper($userMapper);
} else {
$this->usersMapper = new Users_Model_Mapper_User();
}
$this->setIdentity($username);
$this->setCredential($password);
}
/**
* @return Zend_Auth_Result
*/
public function authenticate()
{
// Fetch user information according to username
$user = $this->getUserObject();
if (is_null($user)) {
return new Zend_Auth_Result(
Zend_Auth_Result::FAILURE_IDENTITY_NOT_FOUND,
$this->getIdentity(),
array('Invalid username')
);
}
// check whether or not the hash matches
$check = Password::comparePassword($this->getCredential(), $user->password);
if (!$check) {
return new Zend_Auth_Result(
Zend_Auth_Result::FAILURE_CREDENTIAL_INVALID,
$this->getIdentity(),
array('Incorrect password')
);
}
// Success!
return new Zend_Auth_Result(
Zend_Auth_Result::SUCCESS,
$this->getIdentity(),
array()
);
}
// public function setIdentity($userName)
// public function setCredential($password)
// public function setMapper($mapper)
/**
* @return object
*/
private function getUserObject()
{
return $this->getMapper()->findOneByColumn('username', $this->getIdentity());
}
/**
* @return object
*/
public function getUser()
{
$object = $this->getUserObject();
$array = array(
'id' => $object->id,
'username' => $object->username,
'role' => $object->getRoleId()
);
return (object) $array;
}
// public function getIdentity()
// public function getCredential()
// public function getMapper()
}
你可以修改授权适配器来做任何你需要的事情。
就访问列表而言,要记住的是资源是由字符串定义的。在本教程中,资源定义为:
$this->add(new Zend_Acl_Resource('error::error'));
,冒号左边的字符串代表控制器,冒号右边的字符串代表动作。acl插件中的这一行告诉我们资源是什么:
if(!$acl->isAllowed($user->role, $request->getControllerName() . '::' . $request->getActionName()))
你可以改变你的资源所代表的定义为任何适合你的东西。
提供如何实现ACL的硬性规则是非常困难的,因为似乎每个项目都需要不同的东西。
环顾网络,你会发现Zend框架ACL的几种不同实现,其中一些可能非常复杂。
这里有一个可能提供更多的见解。http://codeutopia.net/blog/2009/02/06/zend_acl-part-1-misconceptions-and-simple-acls/
好运