3

Zend_ACLの使用を検討しています。ただし、私には、ロールを作成してから、それらのロールに、コントローラーがアクセスできる、またはアクセスできないアクションへのアクセス許可を付与しているように見えます。

しかし、私にはそれはかなり限られているようです。私は過去にuser_id、モジュール、コントローラー、およびそれらがアクセスできるアクションを保存するユーザー許可システムを作成しましたが、グループを与えることはありませんでした。したがって、ユーザーごと、モジュールごと、コントローラーごと、アクションごとに、アクセスできるものの基本でした。

それで!グループによる制限を減らしたいので、ユーザーにグループを与え、デフォルトでそれらのグループのアクセス許可を設定する必要があるのではないかと思います。次に、ユーザー固有のロールをロードし、デフォルトのグループによって設定されたロールを上書きします。

4

4 に答える 4

3

でグループを表すためにロール システムを使用することに限定されるわけではありませんZend_Acl

例えば:

あるアプリケーションでは、ベース ユーザー オブジェクトを実装Zend_Acl_Role_Interfaceしています。この場合は、ユーザー固有の文字列を返します。user-1簡単にするために、数字部分がユーザーの一意の ID である のようなものとしましょう。

ユーザー オブジェクトが初期化されると、それ自体が ACL に追加され、ユーザー固有のロールがより一般的なロール (グループに似ています) から継承されます。

if(!$acl->hasRole($this)) {
    $acl->addRole($this, $this->role); // Let's say role == 'member' here
}

これにより、親ロール (またはロール) の一般的なルールを設定できます。配列を 2 番目の引数として addRole に渡して、複数の親を持つことができます。また、ロールにはツリーのずっと上に系統があるので、親この場合の役割は、親の役割自体を持つこともできます)。

したがって、ここで柔軟性を説明するために、この基本的な ACL の設定を想定してみましょう (これはすべて理論的なものであり、この回答の目的だけのために書いています)。

$acl->addRole('guest');
$acl->addRole('member', 'guest');

$acl->allow('guest', 'comments', 'read');
$acl->allow('member', 'comments', 'write');

$user = $My_User_Model->find(1);
$acl->allow($user, 'comments', 'moderate');



$acl->isAllowed($user, 'comments', 'read'); // true
$acl->isAllowed($user, 'comments', 'write'); // true
$acl->isAllowed($user, 'comments', 'moderate'); // true

$acl->isAllowed('member', 'comments', 'moderate'); // false

等々...

Zend Framework コンポーネントの優れた点は、それらを 1 つの特定の方法で使用することにまったく制限されないことです。はい、これは困難な場合もあり、多くの場合、最初の計画と実装にもう少し時間を費やす必要がありますが、長期的には素晴らしいことです。

また、個人的には、ACL 特権をコントローラー/アクション構造に直接マッピングすることは好きではありません。しかし、それはまったく別の会話です。

于 2010-07-01T18:53:39.680 に答える
0

フィードバックをお寄せいただきありがとうございます。ただし、自分で作成することにしました。誰かが興味を持っている場合:

public function verify($controller=NULL, $action='index', $module='administration') {

    if ((isset($this->object[$module]['all']) && is_string($this->object[$module]['all'])) || isset($this->object[$module][$controller][$action]) || (isset($this->object[$module][$controller]) && is_string($this->object[$module][$controller]))) {
        return true;
    }
}

public static function check($values) {

    $module         = $values['module']     ? $values['module']     : 'administration';
    $controller     = $values['controller'] ? $values['controller'] : 'index';
    $action         = $values['action']     ? $values['action']     : 'index';
    $user_id        = $values['user_id'];

    $db    = Zend_Registry::get('dbAdapter');
    $query = $db->prepare(" 
        SELECT * 
        FROM `".self::table_name."` 
        WHERE 
            (
                (`module` = :module AND `controller` = :controller AND `action` = :action) OR
                (`module` = :module_2 AND `controller` = :controller_2 AND `action` = '') OR 
                (`module` = :module_3 AND `controller` = '' AND `action` = '')
            )
        AND enabled = 1 
        AND user_id = :user_id      
        ");

    $query->bindValue('module',         $module);
    $query->bindValue('module_2',       $module);
    $query->bindValue('module_3',       $module);
    $query->bindValue('controller',     $controller);
    $query->bindValue('controller_2',   $controller);
    $query->bindValue('action',         $action);
    $query->bindValue('user_id',        $user_id);

    $query->execute();
    $item = $query->fetch(PDO::FETCH_OBJ);
    $query->closeCursor();

    if (is_object($item)) {
        return $item;
    } else {
        throw new exception("Could not load user permission for this page ($module, $controller, $action)");
    }
}

とビューで:

    <?php if ($this->user_permissions->verify('movie')) { ?>
        <li class="parent">
            <img src="/design/images/icon/dvd.png" /> <span class="highlighter"><a href="/administration/movie/index">Movie</a></span>
            <?php if ($this->user_permissions->verify('movie', 'add')) { ?>
                 | <a href="/administration/movie/add">Add</a>
            <?php } ?>
            <?php if ($this->user_permissions->verify('movie', 'featured')) { ?>
                <ul>
                    <li>
                        <img src="/design/images/icon/order.png" /> <a href="/administration/movie/featured">Order Featured</a>
                    </li>
                </ul>
            <?php } ?>
        </li>
    <?php } ?>
于 2010-07-05T14:43:33.953 に答える
0

上記への返信で(私の返信は長すぎます)

ええ、私はそのようにすることの大ファンではありません。その特定のユーザー用に配列をロードする必要があります。

$item['Movie'] = 1;
$item['Movie']['manage']['edit'] = 0;

次に、これらのアクセス許可を (db から配列に) ロードするプラグインを実行し、現在のモジュール/コントローラー/アクションを調べてチェックします。

if (isset($item[$module]) && $item[$module] == 1) {
   if (isset($item[$module][$controller][$action]) && $item[$module][$controller][$action] == 0) {
       return false;
   }
   return true;
} else { 
 return false;
}

次に、ブートストラップで、false の場合は例外をスローします。(覚えておいてください、これはフロント エンドではなく、私のサイトの管理領域用であるため、一般的なユーザー アクセスについては気にしません。

また、その配列をビューに渡し、リンクで単純な if ステートメントを実行します。

<?php if ($this->userPermission['Movie']['manage']['edit'])) { ?>
<a href="/administration/Movie/manage/edit/id/1">Edit Movie</a><?php } ?>

欠点は、そのメソッドがコントローラーを変更した場合、テンプレートを編集する必要があることです。ただし、私が読んだチュートリアルから Zend_ACL ビューの実装を見たことがないので、そこで行うことと大きく異なるかどうかはわかりません。

于 2010-06-29T17:29:56.080 に答える
0

あなたは正しい軌道に乗っています。

厳密に定義された「グループ」または「ユーザー」の概念はありません。

あなたには役割があるだけです。特定のリソース (特定のアクションや「記事」オブジェクトなど) にアクセスできる「編集者」のような役割を持っている場合があります。また、user_1234 のような役割があり、追加のルールを持つこともできます。

ID 1234 のユーザーに両方の役割を付与します。

于 2010-06-29T17:20:14.917 に答える