2012-01-05 14 views
2

Authコンポーネントを使用してログインするとCake 2.0.5では、Cakeはすべての関連モデルを取得しているようです。多くのアソシエーションでは、ログインに時間がかかります。CakePHP 2.0.5認証とユーザーモデル再帰的な問題

この問題は、this ticketで最初に確認されましたが、「解決策」はあまり意味がありません。ドキュメントには何も見つかりません。

2.0でFormAuthenticateクラスを使用すると、サブクラス化して を追加することができます。再帰レベルはかなり簡単だと思います。

これを経験した人は誰ですか?

以下 - サンプルコード:

標準のログイン方法:

public function login() { 
    $this->User->recursive = -1; // does nothing 

    if ($this->Auth->login()) { 
     $this->redirect($this->Auth->redirect()); 
    } else { 
      $this->Session->setFlash('Invalid username or password.'); 
    } 

} 

とクエリケーキは私のアプリのために作成されています

SELECT `User`.`id`, `User`.`username`, `User`.`password`, `User`.`role`, `User`.`created`, `User`.`modified`, `Band`.`id`, `Band`.`name`, `Band`.`genre`, `Band`.`location`, `Band`.`influences`, `Band`.`founded`, `Band`.`bio`, `Band`.`created`, `Band`.`modified`, `Band`.`status`, `Band`.`website`, `Band`.`email`, `Band`.`contact_number`, `Band`.`user_id`, `Member`.`id`, `Member`.`user_id`, `Member`.`first_name`, `Member`.`last_name`, `Member`.`display_name`, `Member`.`dob`, `Member`.`gender`, `Member`.`bio`, `Member`.`influences`, `Member`.`band_id` FROM `users` AS `User` LEFT JOIN `bands` AS `Band` ON (`Band`.`user_id` = `User`.`id`) LEFT JOIN `members` AS `Member` ON (`Member`.`user_id` = `User`.`id`) WHERE `User`.`username` = 'admin' AND `User`.`password` = 'dcec839a9258631138974cbccd81219f1d5dfcfa' LIMIT 1 

あなたはそれがすべてのフィールドを取得しています見ることができるように、すべてのモデルに参加してください。私のアプリには2つの追加の関連付けしかありませんが、非常に複雑なアプリケーションではこれがどのように問題になるかを見ることができます。

本当に、それはちょうどユーザーテーブルである必要があります。 recursiveの設定は、まったく何もしていないようです。

答えて

1

Markが示唆しているのは、FormAuthenticateクラスを拡張すること、または基本的にそれをオーバーライドすることです。

これは、コードの基本構造であるapp/Controller/Component/Auth/ExtendedFormAuthenticate.php

に新しいファイルを作成します - 私は、再帰レベルが_findUser方式に設定されている重要なビットに残してきた:

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

class ExtendedFormAuthenticate extends FormAuthenticate 
{ 
    public function authenicate(CakeRequest $request, CakeResponse $response) { 
    // foo 
    } 

    protected function _findUser($username, $password) 
    { 
    // bar 

     $result = ClassRegistry::init($userModel)->find('first', array(
      'conditions' => $conditions, 
      'recursive' => -1 
     )); 

    // fooBar 
    } 
} 

https://gist.github.com/1565672

私は、拡張クラスを使用するためにAuthComponentをセットアップする必要があることをほとんど忘れてしまいました。

public $components = array(
    'Auth'=> array(
    'authenticate' => array(
     'ExtendedForm' 
    ) 
), 
); 
+0

完璧に見えます。家に帰るときに試してみるよ。ケーキがこの機能を導入したことはちょっと奇妙に思えます。この機能は最初は役に立たず、クラスを拡張して修正する必要があります。ありがとう – Ross

2

あなたはAuthコンポーネントのための再帰オプションを使用することができます。

public $components = array(
    'Auth' => array(
     'authenticate' => array(
      'Form' => array('recursive' => -1) 
     ) 
    ) 

またはのbeforeFilter方法で:

$this->Auth->authenticate = array('Form' => array('recursive' => -1)); 
+0

はこれを動作させることができませんでした – Connel