7

半年前にMVCパターンを使い始めましたが、いまだに誤解があります。

ここで、アプリケーションにロール ベースのアクセス制御を実装したいと考えています。ただし、私の質問は RBAC に関するものではなく、MVC に関するものです。

RBAC の私の実装は次のとおりです: user->role->permission すべてのユーザー (例: userA) は多くの役割 (例: リーダー、編集者、管理者) を持つことができ、すべての役割は多くの権限 (読み取り、更新、削除、など) を持つことができます。等。)。

MySQL テーブル

  • users (ユーザーのリスト)
  • ロール (ロールのリスト)
  • パーミッション (パーミッションのリスト)
  • roles_permissions (役割のリスト -> 権限の接続。例: エディター -> 更新)
  • users_roles (users->roles 接続のリスト。ex. userA->editor)

今私の質問は、 これを MVC でどのように実装すればよいですか? ユーザー、ロール、パーミッション、roles_permissions、user_roles に対して別のモデルを用意し、ユーザー、ロール、パーミッション、roles_permissions、および user_roles を作成する authManager クラスを用意しますか? この方法は正しいですか?より良い、おそらくよりエレガントな方法はありますか?

4

4 に答える 4

8

基本的に、独自のライブラリを作成するのではなく、既存の多くの Kohana ACL ライブラリの 1 つを使用します (または、少なくともそれらがニーズに合っているかどうかを確認します)。

このスレッド (Wouter A1、A2、および ACL モジュール) を確認することをお勧めします - http://forum.kohanaframework.org/discussion/1988/releases-a1-authentication-acl-acl-for-kohana-a2-object-level -authorization/p1
常に更新および保守されており、3.2 バージョンでも使用できます。

Wouter モジュールが複雑だと感じる場合は、Vendo ACL モジュールを確認することもできます。これは非常にシンプルで、多くの複雑さを取り除きます - https://github.com/vendo/acl
使用例 - http://forum.kohanaframework .org/discussion/9517/getting-started-with-vendo-acl/p1

于 2011-12-22T08:13:30.687 に答える
2

説明しているACLであるため、通常、これにはACLライブラリ/クラスを使用することをお勧めします。私はコハナを知りませんが、簡単なグーグルからこのコハナACLライブラリを見つけました。https://github.com/synapsestudios/kohana-acl

ただし、基本的には、ユーザー、ロール、権限など、ACLライブラリ内の個別のエンティティを管理するためのモデルが実際に必要になります。次に、コントローラーまたは他のライブラリのACL-apiと通信して、アプリの特定の部分へのアクセスを決定します。

于 2011-12-22T08:02:39.647 に答える
1

Zend_ACL が既に含まれていると仮定して、KohanaPHP のメイン アプリケーション コントローラーのコードをコピー アンド ペーストします。

グループベースではなく、ユーザーベースの権限を持っていることに注意してください...ただし、これは簡単に編集できます。

<?php

defined('SYSPATH') OR exit('No direct script access.');

class Controller_Application extends Controller_Template
{

    protected static $acl;
    public $template = 'default';

    public function before()
    {
        parent::before();
        session_start();
        self::$acl = new Zend_Acl();
        $this->set_permissions($_SESSION['userid']);
    }

    protected function check_access($resource, $privilege, $redirect = TRUE)
    {
        $permission = (self::$acl->has($resource) AND self::$acl->isAllowed($_SESSION['userid'], $resource, $privilege));
        if (!$permission AND $redirect)
            $this->request->redirect('user/denied');
        elseif (!$permission AND !$redirect)
            return FALSE;
        elseif ($permission AND !$redirect)
            return TRUE;
    }

    protected function set_permissions($user_id)
    {
        $result = DB::select()
            ->from('permissions')
            ->where('user_id', '=', $user_id)
            ->execute()
            ->as_array();
        self::$acl->addRole(new Zend_Acl_Role($user_id));
        foreach ($result AS $permission)
        {
            if (!self::$acl->has($permission['resource']))
                self::$acl->add(new Zend_Acl_Resource($permission['resource']));
            self::$acl->allow($user_id, $permission['resource'], $permission['privilege']);
        }
    }
}

?>

次に、次のようにコントローラーでアクセスをチェックします$this->check_access('events', 'add');

于 2011-12-22T08:09:28.660 に答える
1

トレイルが寒いことは知っていますが、新しいプロジェクトが現れました:

PHP-RBAC は、PHP 階層型 NIST レベル 2 標準ロール ベースのアクセス制御であり、かなり成熟しています。これは OWASP プロジェクトでもあります。

http://phprbac.netでお楽しみいただければ幸いです。

RBAC を MVC パターンに組み込む標準的な方法で jframework で使用されます。

于 2013-02-28T13:34:10.943 に答える