Perl mojolicous、重定向、会话并尝试创建身份验证系统

Perl mojolicous、重定向、会话并尝试创建身份验证系统,perl,session,authentication,mojolicious,Perl,Session,Authentication,Mojolicious,我试图在我的mojolicous应用程序中摆脱基本身份验证。我能够检测到缺少会话密钥,并重定向到登录页面。然后登录页面发布到我的应用程序,我向后端进程进行身份验证。后端进程返回成功,然后我的mojo应用程序将会话设置为: $self->session( user => $name, groups => $groups ); 在调试过程中,$name和$group都已定义且有效。然后我希望重定向到我的应用程序的“受保护”空间。重定向到达正确的位置,但随后未能检测到$self->

我试图在我的mojolicous应用程序中摆脱基本身份验证。我能够检测到缺少会话密钥,并重定向到登录页面。然后登录页面发布到我的应用程序,我向后端进程进行身份验证。后端进程返回成功,然后我的mojo应用程序将会话设置为:

$self->session( user => $name, groups => $groups );
在调试过程中,$name和$group都已定义且有效。然后我希望重定向到我的应用程序的“受保护”空间。重定向到达正确的位置,但随后未能检测到$self->session('user')(在调试时未定义)I最终重定向回登录

我将在下面包括设置的片段。我错过了什么

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::Auth

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;
}

我也遇到了类似的问题,最后我把这些东西藏了起来。我认为会话是基于字符串的,主要是因为cookie设置了会话信息。

为什么您的
验证
函数接受名称,通过@变量传递

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

请参见此处的工作示例:

使用起来并不容易,例如:?不一定,而且我想了解为什么这不起作用。对我来说最大的谜团是为什么重定向后会话cookie不可用。你找到答案了吗?我现在也处于同样的情况。在正确的“$self->authenticate”之后,会话具有正确的“auth_data”值,但在重定向或加载另一个页面后,该值将从会话中消失。您是正确的,我认为这就是我的代码中的值。。。对于这个例子,我只是打错了。我会看看你的要点,看看是否有什么不同。我也会编辑我的帖子。谢谢