1

我刚开始使用 Dancer::Session::Cookie,我遇到了一些我没有预料到的行为。我整理了一个简单的 Perl Dancer 应用程序来使用 Authen::Simple::ActiveDirectory 进行身份验证。我的路线如下。

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 回答