1

Dancer::Session::Cookie を使い始めたばかりで、予期しない動作に遭遇しました。Authen::Simple::ActiveDirectory を使用して認証する単純な Perl Dancer アプリをまとめました。私のルートは以下です。

package auth;
use Dancer ':syntax';

our $VERSION = '0.1';

get '/' => sub {
    template 'index', {user => session->{user}};
};

hook 'before' => sub {
    if (! session('user') && request->path_info !~ m{^/login}) {
        var requested_path => request->path_info;
        request->path_info('/login');
    }
};

get '/login' => sub {
    # Display a login page; the original URL they requested is available as
    # vars->{requested_path}, so could be put in a hidden field in the form
    template 'login', { path => vars->{requested_path} };
};

post '/login' => sub {
    # Validate the username and password they supplied
    my $ad = Authen::Simple::ActiveDirectory->new( 
        host      => 'host',
        principal => 'example.com'
    );

    if ($ad->authenticate( params->{user}, params->{pass} )) {
        session user => params->{user};
        redirect params->{path} || '/';
    } else {
        redirect '/login?failed=1';
    }
};

get '/logout' => sub {
    session->destroy;
    redirect '/';
};

true;

正常にログインしてセッションを作成できます。ユーザー名はログイン後にメイン ページに配置され、/logout ルートへのリンクがあります。そのリンクをクリックすると、ルートが実行されますが (デバッガーで確認しました)、ユーザー名が表示されたままメイン ページに戻ります。セッションが存在しないため、ログイン ページに戻ると予想されます。ダンサーがこのように振る舞う理由はありますか? セッションの仕組みを誤解していませんか?

4

1 に答える 1

3

以前にDancer::Session :: Cookieを使用したことはありませんが、destroyメソッドが正しくないようです。サーバー側で解析されたハッシュからCookieエントリを削除しているだけですが、それがに返されることはありません。ブラウザ。

session->destroyこれを試すための呼び出しの代わりに:

cookie session->session_name => '', expires => '-1 day';

これがベルトとサスペンダーのアプローチです。Cookieを空にし、過去に発生する有効期限を設定します。

于 2012-12-06T14:42:43.963 に答える