1

1.11 フレームワークリンクを使用して、Zend Auth および Zend Acl のチュートリアルに従おうとしています。

認証を正常にセットアップし、Acl.php ページで指定された controller::action ペアの認証を使用できるようになりました。最初に、サイトへのアクセスを許可する前に、ユーザー アカウントがアクティブ化されているかどうか、およびユーザーが管理者によって禁止されているかどうかという、users テーブルの 2 つの追加パラメーターをテストしたいと思います。このコードでそれをどのように実装しますか。

次に、1 つのコントローラーの下にあるすべてのアクションをユーザー認証レベルに含める方法を知りたいです。つまり、さまざまなテーブルに対してその下に多数のアクションがあるマスターコントローラーがあります。マスターコントローラーへのアクセスをすべてのアクションを管理者ロールのみに制限する方法を教えてください。リソースを追加せずに、Acl.php の各アクションにリソースを許可します。また、このロジックを拡張して、コントローラーだけでなくモジュール全体へのアクセスを許可できるかどうか教えてください (1 つのリソースを追加してリソースを許可することにより)。はいの場合、どのように?

4

1 に答える 1

0

最初に、サイトへのアクセスを許可する前に、ユーザー アカウントがアクティブ化されているかどうか、およびユーザーが管理者によって禁止されているかどうかという、users テーブルの 2 つの追加パラメーターをテストしたいと思います。

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 の実装方法について厳格なルールを提供することは非常に困難です。プロジェクトごとに必要なものが異なるように思われるからです。

Web を見回すと、Zend Framework ACL のいくつかの異なる実装が見つかります。それらのいくつかは非常に複雑な場合があります。

これは、より多くの洞察を提供する可能性のあるものです。http://codeutopia.net/blog/2009/02/06/zend_acl-part-1-misconceptions-and-simple-acls/

幸運を

于 2013-05-02T14:27:11.010 に答える