0

私のアプリケーションでは、アプリの作業の開始時に何らかの「自動ログイン」ロジックを実行する必要があります。この「自動ログイン」機能では、多くのアクションを実行します。そのうちの 1 つは、CookieComponent を使用して Cookie を設定することです。

コントローラーまたはコンポーネントでこの autoLogin を使用すると、すべて問題ありませんが、ディスパッチャーフィルターから同じことを行うと、Cookie は設定されません。

CakePHP コードを深く掘り下げたところ、ディスパッチャー フィルターから Cookie を設定しようとすると、の$_cookiesプロパティCakeResponseが空であることがわかりました。したがって、ディスパッチャーフィルターが独自の を作成しCakeResponse、後でリセットするように見えるため、Cookie は設定されません。

私のフィルターは次のようになります。

class UserLoadFilter extends DispatcherFilter 
{
    public $priority = 8;    
    public function beforeDispatch($event) {
        App::uses('AuthComponent', 'Controller/Component');
        if (!AuthComponent::user()) {
            App::uses('CustomAuthComponent', 'Controller/Component');
            //$controller = new AppController($event->data['request'], $event->data['response']);
            $auth = new CustomAuthComponent(new ComponentCollection(), Configure::read('Auth'));
            $auth->autoLogin();
        }
    }
}

また、この方法で beforeDispatch メソッドに直接 Cookie を設定しようとしました。

App::uses('CookieComponent', 'Controller/Component');
$cookie = new CookieComponent(new ComponentCollection());
$cookie->write('test', 'TEST!', false, "1 day"); 

しかし、これも意味がありません。

私は何を間違っていますか?単純なことがわからないだけかもしれませんが、多くの時間を費やしましたが、まだこれを修正できません。この場所からクッキーを設定することはまったく可能ですか?

もちろん、setcookie を使用するか、独自の Cookie ラッパーを作成することもできますが、Cookie コンポーネントを使用して CakePHP スタイルで実行したいと考えています。

4

1 に答える 1

1

これは私には間違っているように見えます。2.x は認証および承認オブジェクトを使用するため、コンポーネント部分を意味する CustomAuthComponent は必要ありません。代わりに、カスタマイズされた認証および認可オブジェクトを作成します。

これを beforeDispatcher() で行う必要がある理由がわかりません。それで、あなたの目標は正確には何ですか?どのような種類の認証を実装しようとしていますか?

コメントに基づいて編集します。

ボリスが言ったようにユーザーを特定した後、リダイレクトするだけで、ロケールが設定されます(正しく行った場合)。そのため、beforeFilter() で Cookie から uuid を読み取り、それに基づいてユーザー レコードを取得し、ユーザー レコードを使用して「手動」ログインを行い、リダイレクトします。

AuthComponent で何を変更しましたか?

于 2012-07-29T19:03:48.103 に答える