0

したがって、(いくつかの条件に基づいて) 1 つのアクションが同じコントローラー内の別のアクションに切り替わる場合があります。

現在、最初のアクションは特定の役割 (コーチまたはトレーナー) を持つ人々に許可されていますが、その後のアクションはコーチにのみ許可されています。

ただし、2 番目のアクションに直接アクセスしていないため (中間アクションを介してのみ)、認証コンポーネントはその起動を妨げません。ここにいくつかのコードがあります:

public function isAuthorized($user) {
    switch($this->action) {
        case "bulkAction":
            if ($user['role'] == ('coach' || 'trainer') ) {
                return true;
            }
            break;
        case "bulkDelete":
            if ($user['role'] == 'coach') {
                return true;
            }
            break;
    }
    return parent::isAuthorized($user);
}

public function bulkAction() {
    switch($this->request->data['Action']) {
        case "delete":
            $this->bulkDelete();
            break;
    }
}

繰り返しになりますが、bulkAction がデータを bulkDelete アクションに送信すると、Auth は完全にバイパスされたように見え、アクションは実行されます。他のアクションによって呼び出されたアクションが、コントローラーの isAuthorized コールバックに対して引き続きチェックされるようにするにはどうすればよいですか?

4

1 に答える 1

2

まず、あるアクションが別のアクションを呼び出すことは、本当に悪い設計であり、実行すべきではありません。すべてのユーザーは、bulkAction($type = null) アクションのみを呼び出す必要があります。タイプを指定するには、引数 $type を使用します。したがって、URL は /foo/bulkAction/edit /foo/bulkAction/delete などのようになり、$type パラメータは「edit」、「delete」などの値を受け取ります。それぞれの機能を含むさまざまな保護されたメソッドをコントローラに作成します。必要に応じて、bulkAction を介してそれらを入力して呼び出します。次に、isAuthorized() メソッドで、ユーザーの役割と、$this->request->params['passed'] で利用できるタイプをチェックして、true または false を返します。アクションに param を使用する代わりに、必要に応じて名前付き params を使用することもできます。したがって、アクションは bulkAction() を使用し、URL は /foo/bulkAction/type:delete のようになります。

于 2012-09-22T20:43:27.970 に答える