我正试图在我的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;
}
答案 0 :(得分:0)
我遇到了类似的问题,最后我把它们藏在了藏匿处。我认为session是基于字符串的,主要是因为cookie设置了会话信息。
答案 1 :(得分:0)
为什么您的verify
函数接受名称,通过@_变量传递?
可能需要使用$self->param('name')
和$self->param('pass')
?
请参阅此处的工作示例: https://gist.github.com/Logioniz/bdf6f22c00fc51798c43