2011-10-28 18 views
0

完全に機能するCake 1.3アプリケーションを最近リリースされた2.0バージョンに移行した後、認証は機能しなくなりました。CakePHP 2.0で認証が再び機能するには?

私はAuthComponentの呼び出しと、更新された2.0マニュアルに従ってloginアクションの構造を変更しました。無駄です。奇妙なことは、ユーザーが実際に$this->Auth->login()によって検証され、ユーザーが$this->Auth->redirect()で設定されたURLにリダイレクトするログイン機能の部分に達することです。しかし、そのリダイレクトの後で$this->Auth->user()は空を返し(AuthComponent::user()と同様)、ユーザーはAuthコンポーネントによってログインされません。

処理中にCakeがエラーをスローしない場合、 'auth'のフラッシュメッセージは空のままです。

ユーザーは、ID、ユーザー名、電子メール、パスワード、タイムスタンプの列を含む単純なデータベーステーブルに格納されます。パスワードはハッシュされており、新しいCake 2.0メソッドを使っていくつかのユーザーを追加しました。

これはAppController.phpのコードです:

<?php 
    class AppController extends Controller { 
    public $helpers = array('Session', 'Html', 'Time', 'Form', 'Text'); 
    public $components = array('Session', 'RequestHandler', 'Auth');  

    public function beforeFilter() { 
     $this->Auth->loginAction = array('controller' => 'users', 'action' => 'login'); 
     $this->Auth->loginRedirect = array('controller' => 'maps', 'action' => 'index'); 
     $this->Auth->logoutRedirect = array('controller' => 'maps', 'action' => 'index'); 
    } 
    } 
?> 

UserController.php:

<?php 
    class UsersController extends AppController { 
    public $name = 'Users'; 

    function beforeFilter() { 
     parent::beforeFilter(); 
    } 

    function login() { 
     if ($this->request->is('post')) { 
     if ($this->Auth->login()) { 
      return $this->redirect($this->Auth->redirect()); 
     } 
     } 
    } 

    function logout() { 
     $this->redirect($this->Auth->logout()); 
    } 
    } 
?> 

User.phpモデル。私は、この問題を解決した後、当面は無効フォーム検証しました:私はまたに$components変数に認証機能の一部を設定しようとした

<?php 
    echo $this->Form->create('User'); 
    echo $this->Form->input('username', array('label' => 'Username', 'before' => '<p class="input" id="username">', 'after' => '</p>', 'between' => '<br />', 'div' => false)); 
    echo $this->Form->input('password', array('label' => 'Password', 'before' => '<p class="input" id="password">', 'after' => '</p>', 'between' => '<br />', 'div' => false)); 
    echo $this->Form->end('Login'); 
    ?> 

<?php 
    class User extends AppModel { 
    public $name = 'User'; 
    } 
?> 

ログインビューをAppControllerも正常に動作しませんでした。

public $components = array(
    'Auth'=> array(
     'loginAction' => array(
     'controller' => 'users', 
     'action' => 'login', 
    ), 
     'loginRedirect' => array(
     'controller' => 'maps', 
     'action' => 'index', 
    ), 
     'authenticate' => array(
     'Form' => array(
      'fields' => array('username', 'password') 
     ) 
    ) 
    ) 
); 

ここで問題が発生していますか?おそらくルーティング?私は今$this->Auth->user()が実際に$this->Auth->login()への呼び出し後に正しいユーザーが移入されて知っているがUserControllerでのログイン方法にいくつかのデバッグ文を追加した後 :

require CAKE . 'Config' . DS . 'routes.php'; 

UPDATE:私は除いて、すべてのルートをコメントアウトしました。しかし、別のコントローラにリダイレクトした後、ログインセッションは完全に失われます。だから私はまだここで何がうまくいかないのか分からない。

UPDATE 2 私は自分の作業1.3アプリケーションを取って、私は最後の時間をやったようにそれに移行コンソールのスクリプトを実行して、移行プロセスを再起動しました。

今回は、カスタムコンポーネントに関する2つのエラーが原因でスクリプトが停止していることに気付きました。コンポーネントクラスでは、1.3のdefault:Objectではなく、Componentを拡張する必要があります。

これらのコンポーネントのエラーを修正した後、移行スクリプトを再度実行しました(最初の移行の試行では無視したことがあります)。新しいAuthCompenent呼び出しが実装されました。これまでのところすべてが正しく動作しているようです。 Cakeはエラーメッセージを出力しなかったので、今何が違うのか、何が最初に間違っていたのかは分かりません。

更新3 これは怪しいです。私はそれを解決すると思ったが、コードを別の開発マシンに転送した後、Authは突然動作を停止する。私の主なセットアップでは動作していますが、別のテストでは同じシナリオで失敗します。キャッシュをクリアしましたが、まだ動作していません。 Cakeはエラー出力を生成しません。

UPDATE 4 私のマシンではセッションの問題があるようです。セッションをクッキーに保存するように設定したところで、突然Authが再び動作を開始します。なぜ、デフォルトのSessionが動作していないのかわかりません。その場合、どこでデバッグを開始するのかわかりません。

データベースセッションを定義すると、通常のセッションと同じ結果が得られます。認証が機能しなくなります。

答えて

0

また、認証ハンドラを設定しようとしましたか?

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

はい、私は公共$コンポーネント変数で、私のテストのいずれかで行いました。 – mensch

+0

あなたのセッション設定はどうですか? http://book.cakephp.org/2.0/ja/development/sessions.html – Dan737

+0

セッションは既にCore.phpで設定されていますが、残念ながら新しい設定キーを直接書くことはうまくいきませんでした。 – mensch

1

/Config/core.phpで有効use_trans_sidでそれを試してみてください。

Configure::write('Session', array(
    //'defaults' => 'php' 
    'defaults' => 'cake', 
    'cookie' => 'CAKEPHP2', 
    'ini' => array('session.use_trans_sid' => true) 
)); 
+0

'use_trans_sid'が安全でないと考えられていませんか? – mensch

+0

実際、私はcakeDCユーザープラグイン(2.0ブランチ)をテストしようとしていましたが、うまくいきませんでした。だから私は何がうまくいくのか考え出した。 – 3wv

+0

さて、私は 'session.use_trans_sid' => true ...のせずに動作させました。しかし、私は多くの変更を加え、それを戻したように、理由が分かりません。 – 3wv

関連する問題