我正在使用 Mojolicious::Plugin::Authentication 来处理我的应用程序中的身份验证。我正在尝试为斜杠 '/' 设置一个路由,如果经过身份验证,它将有一个控制器/操作,如果没有,则另一个(即,根据您是否通过身份验证,您会转到不同的页面。)我不确定如何实现这一目标。以下是我尝试过的一些事情:
$r->any('/')->to(cb => sub {
my $self = shift;
if ( $self->is_user_authenticated ) {
$self->redirect_to('member#index');
}
else {
$self->redirect_to('guest#index');
}
});
Run Code Online (Sandbox Code Playgroud)
和...
my $logged_in = $r->under (sub {
my $self = shift;
if (!$self->session("username")) {
return undef;
}
else {
return 1;
}
});
if ( $logged_in ) {
$logged_in->get('/')-to(controller => 'Member', action => 'index');
}
else {
$r->get('/')->to(controller => 'Guest', action => 'index');
}
Run Code Online (Sandbox Code Playgroud)
我不必使用 Mojolicious::Plugin::Authentication。我可以轻松设置会话令牌并自行检查。无论哪种方式,问题仍然存在:如何为给定路线创建动态操作?
附录
忘了补充,我也试过这个:
my $auth = $r->under('/' => sub {
my $self = shift;
# Authenticated
return 1 if $self->is_user_authenticated;
# Not authenticated
return undef;
});
$auth->get('/')->to('member#index');
# Routes related to non-members
$r->get('/')->to('guest#index');
Run Code Online (Sandbox Code Playgroud)
添加另一个细节
我只是想补充一点,我可以根据状态渲染或重定向到不同的东西,例如,
$r->any('/')->to(cb => sub {
my $self = shift;
if ( $self->is_user_authenticated ) {
$self->render('member/index');
}
else {
$self->render('guest/login');
}
});
Run Code Online (Sandbox Code Playgroud)
这确实很好用。但是,我仍然很好奇是否可以根据状态为给定路由设置不同的控制器/操作。
Mojo 挂钩正是您所寻找的,这是一个非常强大的功能,对于身份验证特别有用:
http://mojolicio.us/perldoc/Mojolicious#HOOKS
您可能需要查看 before_dispatch()
希望这可以帮助。