3

Mojolicious アプリケーションと認証用のブリッジがあります。これが私のシナリオです。
データベースに一連の標準エラー応答があり、値を渡してクエリを実行します。たとえば、詳細なエラー応答で 404 を返します。データベースには、エラーに対応する共通の詳細が含まれますが、IP やユーザー名などの他のユーザー固有の詳細はコントローラーから取得されます。よろしければこちらのリンクをご覧くださいエラー応答がどのように構築されるかについて。コントローラーのインスタンスとエラー コードを取得して必要な応答を生成するヘルパーがあります。コントローラー オブジェクトを使用して、エラー応答を含むテーブルの結果セットを介してデータベースにクエリを実行します。コントローラーを介して、応答を作成するために必要なユーザー固有の詳細も取得します。次に、応答が作成され、Json として返されるコントローラーに送り返されます。
私の問題はログアウト時$self->session(expires => 1)です。セッションを無効にする設定をしました。もう一度ログアウトしようとすると、コントローラーを使用してヘルパー ビルドにアクセスし、エラー応答をクライアントに送信します。現在、URI のいずれかにアクセスしようとしても、次のチェックによって最初の試行は無効になります。

unless($self->session('user')) {
    my $res = Controller::Helper->error_res($self, 403);
    $self->render_json($res, status => $res->{httpstatuscode});
    return;
    }

このチェックは初めて機能しますが、リソースに再度 (何度でも) アクセスしようとすると、このチェックは失敗し、ログインせずにリソースにアクセスします。Cookie を見ると、新しい Cookie が作成されます。ここでどこが間違っていますか?そして、そのような問題を処理する最善の方法は何でしょうか? ヘルパー関数は次のようになります

error_res{ 
    my($self,$c,$res) = @_; 
    my @arref = $c->db->resultset('Errorcode')->select_row($res);
    my $ref=$arref[0];
    $ref->{user}=$c->session->{user}->{name};
    $ref->{request}=$c->req->method."".join("\\",$c->req->url->path);
    $ref->{time}=scalar localtime();
    return $ref;
}

特定のエラーを識別するデータベース内の場所resと id。

それで、ヘルパーでまだ利用可能なコントローラーの参照と関係がありますか? ヘルパーで定義を解除$cすると、役に立ちません。
編集1:ここでいくつかの点が欠けていますか?これは正しい方法ですか?
編集 2:ログアウト時にユーザーを無効にします。ユーザーが再度ログアウトしようとすると、エラーに関する追加情報を含むエラーが返されます。ただし、エラーに関する追加情報の作成中に、ユーザー情報なしで新しいセッションが作成されます。これは、次のようにすると発生しません

unless($self->session('user')) {
    $self->render_json("message:User has not logged in", status => 403);
    return;
}
4

2 に答える 2

3

だから私は答えを見つけました。奇妙な動作はperlの自動有効化機能によるものでした。これには、データ構造の動的な作成が含まれます。私の場合、セッション Cookie を介してユーザーの名前を取得しようとします。

$ref->{user}=$c->session->{user}->{name}; 

ユーザーがログインしていない場合、userキーはセッションに設定されていませんがname、エラー応答を作成するときにこのキーを取得しようとします。これにより、user価値のない が作成されます。userキーが存在する かどうかを確認すると、問題が解決しました。

于 2013-01-23T20:42:03.923 に答える
1

コメントを読んだ後、フレームワークが期待どおりに動作していることは確かです。アプリケーション ロジックを変更する必要がある場合があります (編集 2 で示されているように)。

その理由は、セッションが JSON にシリアル化され、署名され、Cookie に保存された単なるハッシュリファレンスであるためです。キーを作成すると、そこにあります。他に何を言うべきかわかりません。

はい、前のセッション Cookie の有効期限が切れた直後に、新しいセッション Cookie が作成されます。これはフレームワークに必要であり、完全に想定されています。

于 2013-01-23T18:16:01.020 に答える