1

私の設計では、アクションにはランクがあり、アクセスするには 0 ~ 10 が必要です (0 はゲスト (ログインしていない)、10 は管理者)。各ユーザーには 0 ~ 10 のランクがあります。ランク以上の場合はアクションにアクセスできますが、それ以外の場合はアクセスできません。素敵でシンプル、それは私が必要とするすべてです。

問題は、CakePHP がアクションを 2 つの別個の概念で処理することを要求していることです。認証システムがそれらを気にするかどうかを判断するために、それらに Auth->allow/deny のマークを付ける必要があります。次に、isAuthorized() でそれらへのアクセスを制御します。

isAuthorized は私のニーズに最適です...ただし、ランク 0 にアクセスしたいアクションは Auth->allow() でなければなりません...これは、私の isAuthorized メソッドを完全に無視します。すべてのページを拒否すると、isAuthorized をチェックする前に、ランク 0 のはずのページでログインがトリガーされるため、認証を許可しても、最初にログインする必要があります。

2 つのシステムを統合する方法、または簡単に置き換える方法はありますか? ほとんどの認証システムは素晴らしく、私が手を加えることなくビジネスを処理してくれます...しかし、これは単に厄介であり、許可/拒否などの混乱に気付かないと問題が発生する可能性があります.

ありがとう!

4

2 に答える 2

4

私の知る限り、これを行う唯一の方法は、ゲスト ユーザーを作成することです。これは、isAuthorized()あなたが説明したようになる前に、Auth コンポーネントがユーザーの存在をチェックするためです。

これは、セッションに直接書き込むことで実行できます。これは、誰かがログインしていることを Auth コンポーネントに伝えるため、isAuthorized()メソッドが呼び出されます。

AppController

public function beforeFilter() {
  // if no one is logged in, log in a guest
  if (!$this->Auth->user()) {
    $this->Session->write(AuthComponent::$sessionKey, array(
      'User' => array(
        'id' => 0
       )
    ));
  }
}

public function isAuthorized($user) {
  $authorized = false;
  if ($this->Auth->user('id') == 0) {
    // public guest user access
  }
  // other logic
  return $authorized;
}

これを行うためのおそらくより良い方法は、カスタム認証オブジェクトを使用することです。これは基本的に、Cake にそのクラスを使用して認証を支援するように指示します。これにより、ロジックが別のクラスに分割され、テストが容易になり、無効にすることさえできます。

アプリ/コントローラー/コンポーネント/認証/GuestAuthenticate.php

App::uses('BaseAuthenticate', 'Controller/Component/Auth');

class GuestAuthenticate extends BaseAuthenticate {
    public function authenticate(CakeRequest $request, CakeResponse $response) {
        // no real authentication logic, just return a guest user
        return array('User' => array('id' => 0));
    }
}

AppController

public $components = array(
  'Auth' => array(
    'authenticate' => array(
      'Form',
      'Guest' // tell Cake to try Form authentication then Guest authentication
    )
  )
);

public function beforeFilter() {
  if (!$this->Auth->user()) {
    // no user? log in a guest (this will fail form authentication
    // then try guest authentication)
    $this->Auth->login();
  }
}

public function isAuthorized($user) {
  $authorized = false;
  if ($this->Auth->user('id') == 0) {
    // public guest user access
  }
  // other logic
  return $authorized;
}

カスタム認証オブジェクトの詳細については、http: //book.cakephp.org/2.0/en/core-libraries/components/authentication.htmlを参照してください。

于 2012-04-24T14:39:16.067 に答える
1

おそらくこれはすでに十分に対処されていますが、私には解決策があります。

私のAppControllerには次のものがあります:

    public function isAuthorized($user = null) {
        if (in_array($this->action, $this->Auth->allowedActions)) {
            return true;
        }
        return false;
    }

お気づきのように、アクションを明示的に承認しないと、認証されたユーザーに対してアクションが拒否されます。公開が許可されていてもです。このコード スニペットは、 isAuthorized() メソッドが Auth->allow() リストの設定を受け入れるようにするだけです。

私には合っているようですので、お役に立てれば幸いです。

于 2012-05-12T22:20:23.277 に答える