2

私は Yii を使用してサイトを構築しようとしていますが、Yii のアクセス制御メタファーについて明確にする必要がある状況に陥っています。具体的には、の子孫でaccessRulesメソッドをオーバーライドできます。CController

前提条件:

これは Gii によってデフォルトで生成されたコードで、ドキュメンテーションによく似ています:

public function accessRules()
{
    return array(
        array('allow',  // allow all users to perform 'index' and 'view' actions
            'actions'=>array('index','view'),
            'users'=>array('*'),
        ),
        array('allow', // allow authenticated user to perform 'create' and 'update' actions
            'actions'=>array('create','update'),
            'users'=>array('@'),
        ),
        array('allow', // allow admin user to perform 'admin' and 'delete' actions
            'actions'=>array('admin','delete'),
            'roles'=> array('admin'),
        ),
        array('deny',  // deny all users
            'users'=>array('*'),
        ),
    );
}

質問:

ここではっきりしないのは、現在の 1 人のユーザーとアクションのみの権限をチェックするのではなく、なぜ多くの異なるユーザーとグループ、および異なるアクションに対してアクセス ルールを定義する必要があるのか​​ということです。-- ここでイタリック体で私の主な質問が強調表示されています。

このコードは、特定の 、特定の 、および特定の が既に知られている特定のリクエストのコンテキストで実行controlleractionuserます。たとえば、ユーザーがゲストの場合、「管理者」ロールまたは認証済みユーザーのルールを定義する理由がわかりません。

理由:

いくつかの精緻化の後、私は次の実装にたどり着きました:

public function accessRules()
{
    return array(
      array(Yii::app()->user->hasRights()?'allow':'deny'),
      );
}

子孫に追加された単純なカスタム メソッドは次のとおりですhasRightsCWebUser

class WebUser extends CWebUser
{
  private $ACL = // ACL example
    array('user' => // controller id
      array('index' => User::AC_MODERATOR, // action ids
            'view' => User::AC_MODERATOR,
            'create' => User::AC_MODERATOR,
            'update' => User::AC_ADMIN,
            'delete' => User::AC_ADMIN,
            'admin' => User::AC_ADMIN),
           // ...
      );

  public function hasRights()
  {
    return (Yii::app()->user->getState('accessRights') >=
      $this->ACL[Yii::app()->controller->id][Yii::app()->controller->action->id]);
  }
}

ご覧のとおり、hasRights現在のユーザーの「権限」(通常どおり DB から読み取る)、現在のコントローラー、およびアクションを使用して、アクセスに関する決定として単一のブール値trueまたはfalse値を計算します。

このアプローチの何が問題なのですか? Yii がデフォルトでそのような単純なものを使用しないのはなぜですか?

Gii によって生成されたaccessRules上記は過剰に見えるだけでなく、アクセス ルールが多くのコントローラーに分散していることを暗示しています。私のアプローチでは、単一のコンパクトな ACL が使用されます。

4

2 に答える 2

0

Yii は、CWebApplication ->authManager アプリケーション コンポーネントを介して階層型 RBAC スキームを実装します。

これを見てください

編集

"let us suppose that we use RBAC and add some rules into the accessRules method, such as with admin role in the example above." 

RBAC を使用する場合、accessRules メソッドにルールを追加しません。

あなたがすることは、3つのステップを含む認可階層を定義することです

例えば。 オペレーション

siteAddProduct->in this case 'site' is the controller name and addProduct is the action in 'site' controller
sitedeleteProduct ...etc

役割

admin,editor...etc

2) 権限項目間の関係 (役割と操作の間) を確立します。これは authitemchild テーブルに格納されます。

例えば。

admin -> siteAddProduct
editor -> sitedeleteProduct
admin->editor

3) ロールをアプリケーション ユーザーに割り当てます。これは authassignment テーブルに格納されます。

たとえば、 ユーザー ID 1 -> 管理者

ベースコントローラーで(アプリ内の他のすべてのコントローラーが拡張されるコントローラークラスがあると仮定して)、beforeAction()メソッドをオーバーライドし、ログインしているユーザー(現在のユーザー)のアクセス許可を確認します

Yii::app()->user->checkAccess($operation);

$operation は要求されたコントローラー + アクションです

を使用してコントローラー名$this->idとアクション名を 取得できます$this->getAction()->id

于 2013-01-09T21:18:32.327 に答える