2012-03-02 4 views
0

私のデータベースにusersというテーブルがあり、テーブル内のすべてのユーザが特定のコントローラアクションを実行する権限を持っているかどうかをチェックしたいとします。私はこのような何か場合:明らかcakephpループ内のACLアクセス許可

foreach($users as $user) 
{ 
    // check if user has permission to execute action 
    $is_allowed = $this->Acl->check(
      array('model'=>'User', 'foreign_key'=>$the_user_id), 
       'controllers/MyController/action_to_be_executed'); 

    if(!$is_allowed) 
    { 
     // give permission to user 
     $this->Acl->allow(
      array('model'=>'User', 'foreign_key'=>$the_user_id), 
       'controllers/MyController/action_to_be_executed'); 
    } 
} 

、私は上記のようなものを持っている場合は、より多くのユーザーは、私がテーブルに持っているが、遅く、このコードは次のようになります。私のテーブルに5,000人以上のユーザーが含まれていても、どのようにしてこれを最適化して速く稼働させることができますか?助言がありますか?でもに、事前に

おかげで

答えて

1

まず考えたのはMyControllerコントローラのコードで

$this->Auth->allow('action_to_be_executed'); 

を使用していたが、それは誰にもアクセスを許可してしまうため、実際にこれは、あなたが何をしたいのか、おそらくではありません訪問者はログインしていません

認証されたユーザーにアクセスを許可することを目標としている場合は、user <-> action_to_be_executedペアごとに特定のアクセス許可を追加する最適化された解決策ではありません。

代わりに、ユーザーをロールにリンクして(まだ終了していない場合)、各ロールにaction_to_be_executedアクションへのアクセスを許可することができます。したがって、aros_acosテーブルのアクセス許可レコードの数が大幅に制限されます。さらに、コードを実行する必要はありません。これはあまりにも悪い最適化ではありません;-)

関連する問題