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