如何将控制器下的所有操作作为Zend Acl中的资源

时间:2013-05-02 13:19:00

标签: php zend-framework

我正在尝试使用1.11框架Link here来学习Zend Auth和Zend Acl的教程!

我已成功设置身份验证,并且能够对Acl.php页面中给出的controller :: action对使用身份验证。首先,我想在users表上测试两个额外的参数,即在允许访问站点之前是否激活用户帐户以及用户是否禁止用户。我如何在此代码中实现它。

其次,我想知道如何将一个控制器下的所有操作都包含在用户授权级别中。即我有一个主控制器,其下面有各种各样的表格。你能告诉我如何将对Masters控制器的所有操作限制为仅限管理员角色。无需为Acl.php中的每个操作添加资源和资源。另请告诉我这个逻辑是否可以扩展到允许访问整个模块而不仅仅是控制器(通过一个添加资源和允许资源)?如果是的话怎么样?

1 个答案:

答案 0 :(得分:0)

  

首先,我想在用户上测试另外两个参数   用户帐户是否已激活以及用户是否已激活的表   在允许访问该网站之前被管理员禁止。

教程代码使用Zend_Auth_Adapter_DbTable的vanilla版本,它使用特定的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()

}

您可以修改auth适配器以执行您需要的任何操作。

就您的访问列表而言,要记住的是您的资源是由字符串定义的。在本教程的情况下,资源定义为:

$this->add(new Zend_Acl_Resource('error::error'));

其中冒号左侧的字符串表示控制器,冒号右侧的字符串表示操作。这是acl插件中的这一行告诉我们资源是什么:

if(!$acl->isAllowed($user->role, $request->getControllerName() . '::' . $request->getActionName()))

您可以将此资源所代表的内容更改为适合您的任何内容。

很难为如何实现ACL提供硬性和快速的规则,因为似乎每个项目都需要不同的东西。

环顾网页,您会发现Zend Framework ACL的几种不同实现,其中一些可能非常复杂。

这可能会提供更多见解。 http://codeutopia.net/blog/2009/02/06/zend_acl-part-1-misconceptions-and-simple-acls/

祝你好运