0

私はこれを行う方法について完全に完全に迷っています。私には、管理者、スタッフ、寄付者の 3 つの役割があります。私の問題は、許可されていないユーザーが URL からアクションにアクセスしようとすると、アクセス許可と適切なリダイレクトで (とにかく私にとって) 本当に混乱することです。

私の UsersController には、次のアクションがあります

  1. admin_index
  2. admin_add
  3. admin_edit
  4. admin_view
  5. admin_delete

接頭辞のないアクション

  1. ログインする
  2. ログアウト
  3. 見る
  4. 追加
  5. 編集

管理者は、ログインとログアウトだけでなく、管理者がプレフィックスされたすべてのアクションにアクセスできる必要がありますが、スタッフと寄付者は後者の 5 にのみアクセスできる必要があります。また、すべてのユーザーが同じログイン フォームを使用していることにも注意してください。

私の AppControlles のコンポーネントには、次のものがあります。

 'Auth' => array(
            'loginRedirect' => array(  
                'controller' => 'donors',
                'action' => 'index'
            ),
            'logoutRedirect' => array(  
                'controller' => 'users',
                'action' => 'login'
            ),
            'authorize' => array('Controller')
)

ただし、私のログイン アクションでは、ユーザー ロールが loginRedirect を適宜変更するかどうかを確認します。

if($this->request->is('post')){
            if($this->Auth->login()){   

            switch($this->Auth->user('role')){
                case 'admin':
                    $this->Auth->loginRedirect = array('controller'=>'users','action'=>'admin_index','prefix'=>'admin','admin'=>true);
                    break;
                case 'donor':
                ...
                break; 
                case .....
            }
         }
 }

質問 1 現在、ドナーの役割を持つ現在のユーザーがログインし、アクセスしようとすると、単に ではなく にlocalhost/sitename/admin/users/addリダイレクトされます。では、管理者のプレフィックスを削除するにはどうすればよいですか?admin/donors/donors

質問 2 また、$this->Auth->allow() の仕組みが完全には理解できません。donersController で、役割に応じてコントローラ アクションへのアクセスを制御したい場合、どうすればよいですか? したがって、たとえば、donorsController に「削除」アクションがある場合、ドナー ユーザーが削除アクションにアクセスすることを拒否しながら、スタッフ ユーザーを許可するにはどうすればよいでしょうか。beforeFilter が解決策だと思いますが、その方法が見つかりません! ポインタはありますか?ありがとう

4

2 に答える 2

1

1) login() アクションで、ユーザー ロールのチェックを実装します。ロールが管理者の場合は、任意のコントローラー/アクションにリダイレクトし、管理者のプレフィックスを設定します。彼が管理者でない場合は、彼を別の場所にリダイレクトします。

if ($this->Auth->login()) {
    if ($this->Auth->user('role') === 'admin') {
        $this->redirect(array(
            'admin' => true,
            'controller' => 'foo',
            'action' => 'bar')));
    } else {
        // Do something else, another redirect or whatever
    }
}

/admin を URL から削除する必要はありません。ユーザーがアクセスを許可されていない URL にアクセスしようとすると、許可されていないことが示されるはずです。

2) 異なる役割にアクセスを許可したい場合は、私が書いたSimpleRbacAuthを使用できます。それがどのように機能するかの例については、テストを確認してください。ネストされた配列構造を定義し、必要なロールをアクションまたはコントローラー全体に追加するか、* を使用して全員にアクセスを許可するだけです。

于 2014-02-14T14:54:44.750 に答える
1

これはあなたにとっての解決策かもしれません。

core.php ファイルに移動し、存在する場合はコメントを外し、存在しない場合は以下の行を追加します。

Configure::write('Routing.prefixes', array('admin'));
Location: app/config/core.php 

以下のコードを AppController.php (cake バージョン 2.X) / app_controller.php (cake バージョン < 2.X) の beforeFilter メソッド内に挿入します。

function beforeFilter(){
    if($this->Auth->user('role') == 'admin'){
        if(!in_array($this->params['action'],array('login','logout')) && (stristr($this->params['action'], 'admin_') === FALSE)){
            $this->redirect(array("controller"=>$this->params['controller'],"action"=>'admin_'.$this->params['action'],"admin" => 1));
        }
    }else{
        if(stristr($this->params['action'], 'admin_')){
        $action = explode('_',$this->params['action']);
        $this->redirect(array("controller"=>$this->params['controller'],"action"=>$action[1],"admin" => false));
        }
    }
}

カスタムエラーページを処理することで管理できる残りの機能。

エラーページのカスタマイズを参照できます

于 2014-02-14T14:40:57.713 に答える