1

ユーザーと企業が参加できるポータルを構築しています。ユーザーは、独立していても、会社の下で働いていてもかまいません。ユーザーのタイプ (個人または会社に関連付けられている) に関係なく、すべてのユーザーが利用できるいくつかの基本的なアクセスがあります。独立したユーザーが利用できる機能は他にもいくつかありますが、ユーザーが会社の下にいる場合、会社の管理者は特定の機能へのアクセスを許可/禁止することができます。Zend_Acl を使用してこれを管理するにはどうすればよいですか?

4

1 に答える 1

1

ACL には条件があります。

ACL (ちなみにプラグイン) を宣言するファイルには、次の宣言があります。はAcl_AdminCanAccessUsersであり、TRUEまたはFALSEZend_Acl_Assert_Interfaceを返します。ここでは、Request オブジェクトもコンストラクターに渡しています。

    // Complex function to see if the current user can create/edit the desired user account.
    $acl->allow('client', 'user', array('edit','create'), new Acl_AdminCanAccessUsers($this->_request));

それでは、見てみましょうAcl_AdminCanAccessUsers

<?php

class Acl_AdminCanAccessUsers implements Zend_Acl_Assert_Interface
{

public function  __construct($request) {
    $this->request = $request;
}

public function  assert(Zend_Acl $acl,
                        Zend_Acl_Role_Interface $role = null,
                        Zend_Acl_Resource_Interface $resource = null,
                        $privilege = null)
{

    /**
     * Can only test when trying to edit a user account
     */
    if ("edit" != $privilege) {
        return TRUE;
    }

    $identity = Zend_Auth::getInstance()->getIdentity();

    /**
     * Get the id from the URL request
     */
    $id = $this->request->getParam('id');

    /**
     * Get user account from DB
     */
    $user = Doctrine_Core::getTable('User')->find($id);

    // Are they editing their own account? Give them a pass
    if ($identity->user_id == $user->user_id) {
        return TRUE;
    }

    // If they don't have the isAdmin flag set to yes on their account
    // Then we'll just deny them immediately
    if ($identity->isAdmin) {
         return TRUE;
    }

    return FALSE;
}
}

ここでわかるように、データベースでユーザー レコードをチェックし、要求されたパラメーターと比較したり、Zend_Auth ID に isAdmin フラグが設定されているかどうかをチェックしたりしています。ロール、リソース、特権以外にもアクセスする必要がある場合は、ACL に対して多くの条件付きチェックを行うことができます。

ハッピーコーディング!

于 2011-01-04T22:49:45.497 に答える