2

私はStarmanベースのサーバーを持っています -

#!/usr/bin/perl
use strict;
use warnings;
use Data::Printer;
use Plack::Builder;

my $app = sub {
    my $env = shift;
    my $session = $env->{'psgix.session'};

    # Print environment variables
    p($env);

    return [
        200,
        [ 'Content-Type' => 'text/plain' ],
        [ "Hello, you've been here for ", $session->{counter}++, "th   time!" ],
    ];
};

my $default = sub {
    my $env = shift;
    p($env);
    return [
        '200', [ 'Content-Type' => 'text/html' ],
        ["Welcome to default page"],
    ];
};

builder {
    mount "/validate" => builder {
        enable "Middleware::Authentication"
        enable "Session";
        $app;
    };
    mount "/" => builder { $default };
};

私自身のミドルウェア「認証」はユーザーを認証し、セッション管理のためにセッション情報(有効期限、セッションキーなど)を返します。では、セッションミドルウェアでこれらの情報をどのように利用できますか?

4

2 に答える 2

2

私の理解が正しければ、問題はミドルウェアの順序だけです。の前に を有効SessionにしますAuth

以下を確認してください。ファイルストレージを使用して、セッションが永続的に保存されます。試してみて、再起動するStarmanと、カウンターがリロードされます。(私はあなたの代わりにインラインAuthenticationミドルウェアを使用しています。)

#!/usr/bin/env perl
use strict;
use warnings;
use Data::Printer;
use Plack::Builder;

my $app = sub {
    my $env = shift;
    my $session = $env->{'psgix.session'};
    return [
        200,
        [ 'Content-Type' => 'text/html' ],
        [
            "My app page is visited ",
            $session->{counter}++,
            "th times! Validation is done at:",
            $session->{mwaretime},
            q{<br><a href="/validate">go validate again</a> --- <a href="/">reload this page</a>}
        ],
    ];
};

my $validate = sub {
    my $env = shift;
    my $session = $env->{'psgix.session'};
    $session->{counter} = 0;
    return [
        '200', [ 'Content-Type' => 'text/html' ],
        [
            "Resetting the counter:",
            $session->{counter},
             ". Time from middleware: ",
            $session->{mwaretime},
            q{<br> <a href="/validate">reload this page</a> --- <a href="/">go to index</a> }
        ],
    ];
};

builder {
    #the session will be stored persistently
    #enable the Session BEFORE your middleware
    enable 'Session', store => 'File';

    mount "/validate" => builder {
        #enable "Authentication";
        #following is same as an middleware
        enable sub {
            my $app = shift;
            return sub {
                my $env = shift;
                my $session = $env->{'psgix.session'};
                $session->{mwaretime} = time();
                $app->($env);
            };
        };
        #end of the middleware
        $validate;
    };
    mount "/" => $app 
};
于 2015-03-19T20:33:07.900 に答える
1

あなたの質問から、要件が正確にどのように見えるかを伝えるのは困難です。しかし、セッション管理をこれだけ細かく制御したい場合は、独自のミドルウェアを作成する方がよい場合があります。とはいえPlack::Middleware::Session、特定のシナリオに適応する方法はいくつかあります。しかし、それらのほとんどは多かれ少なかれ文書化されていない機能を使用しています。これは、ソースに慣れる必要があること、およびこれらの機能が後のバージョンで変更または廃止される可能性があることを意味します。

独自のセッション キーを提供する場合は、カスタム SID ジェネレーターとバリデーターを に渡すことができますPlack::Session::State

enable 'Session',
    state => Plack::Session::State->new(
        sid_generator => $my_generator,
        sid_validator => $my_validator,
    );

ドキュメントsid_generatorは、基本的に「ソースを読むだけ」と書かれています。

Plack::Session::Store独自のバックエンドを実装することもできます。ただし、この場合は、カスタム ソリューションに切り替える方が理にかなっている可能性があります。

Cookie の有効期限に関しては、新しい Cookie が作成されるexpiresにオプションを設定できます。$env->{'psgix.session.options'}

$env->{'psgix.session.options'}{expires} = $my_expires;

これはタイムアウトではなく、UNIX エポックからの秒数、または によって受け入れられる任意の値Cookie::Bakerです。

認証ミドルウェアが本当にセッションキーを生成する必要があるかどうかを再考する必要があるかもしれません. @ jm666が言ったように、通常、認証の前にセッションミドルウェアを実行します。その後、認証コードはすべてのセッション情報にアクセスできます。通常、セッション ID はセッション管理の実装の詳細であり、コードの他の部分に関係する必要はありません。有効期限を変更するには、この質問に対する私の回答を参照してください。

于 2015-03-24T11:23:16.437 に答える