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