-1

わかりました、私はケーキと ACL、および MVC アーキテクチャの初心者であると言って前置きします。サイトhttp://book.cakephp.org/2.0/en/tutorials-and-examples/simple-acl-managed-application/part-two.htmlの Cakephp チュートリアルに従っています。チュートリアルの内容は理解できましたが、この単純なグループ ベースの ACL を次のレベルに引き上げる最も簡単な方法について疑問に思っています。SOを無駄に検索しました。それでは、質問を続けます。

たとえば、上記のチュートリアルの関数を少し変更したバージョンを見てみましょう。ACO の ARO 権限を設定するだけです。

多くの地区と多くの部門があり、それぞれに多くのユーザーがいます。

関係は次のとおりです: 学区には多くの部門があります -- 1 対多。地区には多くのユーザーがいて、ユーザーは潜在的に多くの地区を持つことができます (その地区の部門に属している限り)。部門には、AnBelongsToMany のユーザーがいます -- 多対多。

public function initDB() {
    $group = $this->User->Group;

    //Allow admins to everything
    $group->id = 1;
    $this->Acl->allow($group, 'controllers');

    // issue 1) allow district managers to districts, departments, users
    $group->id = 2;
    $this->Acl->deny($group, 'controllers');
    $this->Acl->allow($group, 'controllers/Districts');
    $this->Acl->allow($group, 'controllers/Departments');
    $this->Acl->allow($group, 'controllers/Users');

    //issue 2) allow department managers to edit departments and users
    $group->id = 3;
    $this->Acl->deny($group, 'controllers');
    $this->Acl->allow($group, 'controllers/Departments');
    $this->Acl->allow($group, 'controllers/Users');
    //we add an exit to avoid an ugly "missing views" error message
    echo "all done";
    exit;

}

わかりました、これらのアクセス許可を設定すると、確かに便利ですが、実際には問題の小さな部分が解決されます。現状では、部門管理者が地区レベルの機能を実行できないようにしただけです。地区管理者と部門管理者の両方が制限なしでユーザー CRUD を実行できます

私がやりたいのは、各管理者タイプ USER CRUD の範囲を、部門または地区内に居住するユーザーのみに制限することです。たとえば、部門管理者の Foo は別の部門管理者のユーザーを削除できません。また、Dist 管理者バーは、別の部門管理者のユーザーの名前をすべて nancy に変更することはできません。

笑。私はこれを達成する方法に真剣に迷っています。

1つのアプローチは、管理者のランク、たとえばdist adminを取得してから、彼がどの地区のユーザーであるかを把握することだと思います。最後に、この地区のすべてのユーザーを変数 $userScope に返します。繰り返しますが、私は Cake php を初めて使用するので、たとえそれが良いアイデアであり、これを処理する最善の方法であったとしても、この提案を実行する方法がわかりません。助言がありますか??前もって感謝します!!!

編集:役立つ答え、@nicolae。

ただし、特定の管理者 (特定の aco の) が編集を許可されているすべてのユーザーを返す関数を作成できるようです。私は管理者、彼/彼女自身が返されたユーザーベースの一部であると想定しているため、私にはこのように思えます。たとえば、dist 9 の dist admin は dist 9 に常駐します。同様に、部門 1 の部門管理者は部門 1 に常駐します。

could i write something like:

 public getUserScope(){
 $id = $this->Auth->user('id');
 $dept = $this...
 $dist = $this...
 $access_level = $this->Session->read('Auth.User.group_id');
 if($access_level == 3){
      //get all users in this user's dept
 } elseif($access_level == 2) {
     //find all users in this user's dist
 } elseif($access_level == 1) {
      //find all users
 }
}

ああ。この情報をまとめるために関係するすべての結合テーブルを許可すると、実際に入力すると、これはクラゲの毛のように見えるはずです。私の論理が見えますか?これは私が明確に表現するのが少し難しいです。さらに明確にする必要がある場合はお知らせください。

4

1 に答える 1

1

したがって、グループ IDコントローラー/アクション以上のものに基づいて制限を管理する ACL システムをセットアップしようとしています。部門および地区ベースの制限が必要です。
私の知る限り、CakePHP に組み込まれた ACL システムは、このレベルの制限を管理できません。

解決策として、ユーザーがアクセスする必要がある場所へのアクセスを許可し (たとえば、部門管理者はユーザーの CRUDインターフェイスへの ACL アクセス権を持っている)、コントローラーに特定の制限を挿入することをお勧めします。

function editUserFromDepartment($userId = NULL) {
    // Custom ACL check
    if (! $this->__checkDepartmentByUserId($userId)) {
        // Show the user a custom error message and redirect him to index page
    }

    // User editing code ...
}

function __checkDepartmentByUserId($userId) {
    $dept = $this->Department->getByUserId($userId);

    // Check if the current user belongs to this department
    $currentUserDepartmentId = $this->Session->read('Auth.User.department_id');

    return ($dept['Department']['id'] != $currentUserDepartmentId);
}

頑張ってください。私の説明が十分に明確であるかどうかをお知らせください。

ニコラエ

編集(@Todd の編集に回答しようとしています): ご指摘のとおりです。コードは、現在のユーザーがアクセスできるすべてのユーザーを取得することを目的としています。それよりも、イベントベースのアプローチを使用します。ユーザーXを編集しようとすると、ユーザーXに対して Auth.User がこのアクションを実行できるかどうかを確認するクエリを実行します。

たとえば、あなた (Todd) は私のプロファイル (NicolaeS) を編集して私の従業員 ID を変更しようとしています。私の現在の ID が間違っているからです。
この関数$this->getUserScope('user-ID-of-NicolaeS')は、部門 IDまたは地区 ID がメインと同じかどうかをチェックし、このチェックに従ってアクションの続行を許可/禁止します。

これは十分に明確/単純に見えますか?

よろしく、ニコラエ

于 2013-03-11T16:32:15.053 に答える