8

セッションの有効期限がかなり短い (15 分) 必要がある Catalyst アプリケーションを作成しています。標準の Catalyst フレームワーク認証モジュールを使用しているため、ユーザー データはセッションに保存されます。つまり、セッションの有効期限が切れると、ログアウトされます。

このアプリケーションの使用の多くは、完了までに 15 分以上かかるため、ユーザーは頻繁にフォームを送信して、セッション状態が失われ、再度ログインする必要があることに気付きます。

これが発生した場合、元のフォーム送信を保持したいと思います。ログインに成功した場合は、セッションが期限切れになっていないかのように、フォーム送信を続行して実行します。

コントローラーの auto() メソッドによって処理される認証処理があります。認証が必要なアクションを要求し、現在ログインしていない場合は、login() メソッドにリダイレクトされ、ログインフォームを送信し、送信後に処理します。auto メソッドが login() にリダイレクトするときにリクエストと任意のフォーム パラメータを保存し、login() が成功した場合はそれらを引き戻すことが可能であるように思われますが、最善の方法については完全にはわかりません。この情報を汎用/標準/再利用可能な方法で取得または保存する方法。(私はそれをセッションに保存し、引き出されたら削除することを考えています。それが悪い考えのように思える場合は、別の対処が必要です。)

これを行うための標準的な「ベストプラクティス」またはクックブックの方法はありますか?

(1 つのしわ: これらのフォームは POST 経由で送信されます。)

4

5 に答える 5

4

日常的にアクション間に 15 分以上の間隔が必要なアプリで 15 分のタイムアウトを強制することには、根本的な欠陥があると思わずにはいられません。

Catalyst::Plugin::Session->delete_sessionとはいえ、メソッドをオーバーライドして、の内容$c->request->body_parametersがシリアル化され、後で回復できるように (おそらくデータベースに) 保存されるようにすることを検討します。おそらく、POST 引数が期待どおりであることを確認するために、いくつかの基本的なチェックが必要になるでしょう。

同様に、create_sessionこのデータをデータベースから引き戻し、元のフォーム アクションで使用できるようにする必要があります。

厄介な状況のように思えますが、最初の文を繰り返したいと思います...

アップデート:

delete_sessionまたはを使用する場合autoでも、逆説的な問題が残ります。タイムアウト イベントによってセッションが破棄されるため、この情報をセッションに保存することはできません。セッションの再初期化後も存続するように、より永続的な場所に保存する必要があります。Catalyst::Plugin::Sessionそれ自体がStorableを使用しており、これらの行に沿って何かできるはずです:

use Storable;
...
sub auto {
    ...
    unless (...) { #ie don't do this if processing the login action
        my $formitems = freeze $c->request->body_parameters;
        my $freezer = $rs->update_or_create(
              {user => $c->user, formitems => $formitems} );
        # Don't quote me on the exact syntax, I don't use DBIx::Class
    }
    ...
    my $formitems = $c->request->body_parameters
                  || thaw $rs->find({$user => $c->user})->formitems
                  || {} ;
    # use formitems instead of $c->request->body_parameters from here on in

基になるテーブルには、おそらく (user CHAR(x), formitems TEXT) などがあります。おそらく、あまりにも古いものが回復されないようにするためのタイムスタンプです。取得したフォーム項目が正しいフォームに属していることを確認するために、処理していたアクションを保存することもできます。アプリの問題については、私よりあなたの方がよく知っています。

于 2009-01-07T01:18:54.023 に答える
2

モデル内のユーザーごとのデータのようなものとして、フォーム データを保存します。

Catalyst::Plugin::Session::PerUserは、それを行う 1 つの方法です (ややハックですが)。セッション プラグインは認証のみに使用し、代わりにユーザー データを保存するモデルにすべての状態情報を保存することをお勧めします。

そして、この文脈では 15 分の制限は本当に逆効果に思えるという RET の意見に私は完全に同意します。

于 2009-01-07T04:07:56.273 に答える
1

最終的に、保留中のリクエスト (URL+params) を auto() で取得し、シリアル化して暗号化し、ログイン ページの非表示のフォーム要素を介して渡すことになりました。隠し要素が入力されたログイン要求を受け取った場合は、それを復号化して逆シリアル化し、適切にリダイレクトします (標準の「このユーザーがこのことを実行できるか」コード パスを確実に通過するようにします)。

于 2009-02-21T03:35:13.120 に答える
0

数分ごとに小さなリクエストを行うことで、セッションが期限切れにならないようにクライアントに JavaScript を設定することができます。

または、フォームを投稿する前にアクティブなセッションを AJAX チェックし、必要に応じてその時点で新しいログイン ボックスをユーザーに提示することもできます。

于 2009-01-07T17:01:12.250 に答える