Mojolicious,重定向,会话和尝试创建身份验证系统

时间:2015-04-09 20:10:37

标签: perl session authentication mojolicious

我正试图在我的Mojolicious应用程序中摆脱Basic Auth。我能够检测到会话密钥的缺失并重定向到登录页面。登录页面然后发布到我的应用程序,我对后端进程进行身份验证。后端进程正在返回成功,然后我的mojo应用程序就像这样设置会话:

$self->session( user => $name, groups => $groups );

在调试时,$ name和$ group都已定义且有效。然后,我希望重定向到我的应用程序的“受保护”空间。重定向落在正确的位置,但后来无法检测到$ self->会话('用户')(调试时是undef)我最终重定向到重复登录。

我将在下面提供设置的摘要。我错过了什么?

MyApp.pm

my $r = $self->routes;
$r->route('/verify')->via('post')->to('util-auth#verify')->name('verify');
$r->route('/login')->via('get')->to('util-auth#login')->name('login');
my $app = $r->under('/myapp')->to('util-auth#check');

$app->route('/foo')->via('get')->to('controller-api#foo')->name('foo');

MyApp的::的Util ::验证

sub verify {
    my $self = shift;
    my $name = $self->param('username');
    my $pass = $self->param('password');
    my $dest = "/myapp/foo"; # in the protected area

    if ( $self->authenticate($name, $pass) ) {
        my $groups = $self->get_groups($name);
        $self->session(
            user => $name,
            groups => $groups,
        );
    }
    else {
        $self->flash( message => "invalid login..." );
    }
    $self->redirect_to($dest);
}

sub login {
    my $self = shift;
    $self->render();    # renders the login form
}

sub check {
    my $self = shift;
    my $user = $self->session('user');
    return 1 if defined $user;
    $self->redirect_to('/login');
    return 0;
}

2 个答案:

答案 0 :(得分:0)

我遇到了类似的问题,最后我把它们藏在了藏匿处。我认为session是基于字符串的,主要是因为cookie设置了会话信息。

答案 1 :(得分:0)

为什么您的verify函数接受名称,通过@_变量传递?

可能需要使用$self->param('name')$self->param('pass')

请参阅此处的工作示例: https://gist.github.com/Logioniz/bdf6f22c00fc51798c43