2

codeigniterフレームワークを使用していて、tankauth認証を実装しようとしています。通常のページでうまく機能します。コントローラの__constructに、

if (!authenticated) { redirect('auth'); }

コントローラのすべての機能を保護するためにそこにあります。これは、ユーザーの資格情報がタイムアウトし、ユーザーが新しいページを読み込もうとした場合に正常に機能します。ユーザーが再度ログインできるように、ユーザーを認証ページにリダイレクトするだけです。ただし、コントローラーの関数がajaxを介して呼び出されると、無限ループが発生します。ページがすでに読み込まれているときにリダイレクトヘッダーを送信しようとしているためだと思います。

ログインしていない人が関数を呼び出そうとしたときに、ajax呼び出しを保護し、ユーザーを認証ページにリダイレクトする正しい方法は何ですか?

ありがとう!

4

1 に答える 1

0

私は一般的にtankauthに精通していないので、より良い方法があるかもしれませんが、一般的には、コントローラーからリダイレクトを呼び出す代わりに、メッセージを返し(JSONなど)、リダイレクトするのではなく、スクリプトを終了する必要があります。

Ajax呼び出しを行ったクライアント側のJavascriptは、応答をチェックし、ユーザーがログアウトしたことを示している場合は、javascriptを使用してログインにリダイレクトします(window.location)。Ajaxを介して要求されたページにリダイレクトを送信した場合、ブラウザーはリダイレクトされません。Ajax呼び出しはリダイレクトに従うだけであり、Ajax呼び出しの結果はログインページが返すHTMLになります。

したがって、次のようになります。

if (!authenticated) {
    if (is_ajax_call) {
        echo json_encode(array('error' => 'loggedout'));
        exit;
    } else {
        redirect('auth');
    }
}

errorJavascriptは、応答にキーが含まれているかどうかを確認し、含まれている場合はloggedout、ユーザーのブラウザをログインページにリダイレクトする必要があります。

于 2012-06-13T01:04:37.690 に答える