Mojolicious базовая аутентификация с использованием "под" без Mojolicious:: Lite
Я ищу чистый и простой пример того, как использовать функциональность "Под" в приложении "Mojolicious". Все примеры, которые я нахожу, имеют дело с" Mojolicious::Lite " (который я не использую). Например, я слушал скринкаст здесь http://mojocasts.com/e3 и я думаю, что понимаю концепцию функциональности under. Но я не использую "Mojolicious::Lite", поэтому кажется, что я не могу следовать примеру напрямую. Я не пытаюсь принять Lite-пример для не-облегченного стиля. (Это, вероятно, также потому, что я все еще новичок в рамках)
соответствующий код выглядит так:
# Router
my $r = $self->routes;
# Normal route to controller
$r->get('/') ->to('x#a');
$r->get('/y')->to('y#b');
$r->any('/z')->to('z#c');
Так что все эти маршруты должны быть защищены пользователем/пройти. Я попытался сделать что-то вроде этого:
$r->under = sub { return 1 if ($auth) };
но это не компилируется, и я просто не могу найти пример, соответствующий этому стилю кода... Может ли кто-нибудь дать мне правильный намек или ссылку здесь? И, пожалуйста, простите меня, если это где-то в документации... они могут быть полными, но им не хватает понятных примеров для таких простодушных парней, как я :-P
3 ответов
аналогичный код для Lite-примеров выглядит следующим образом:
# Router
my $r = $self->routes;
# This route is public
$r->any('/login')->to('login#form');
# this sub does the auth-stuff
# you can use stuff like: $self->param('password')
# to check user/pw and return true if fine
my $auth = $r->under( sub { return 1 } );
# This routes are protected
$auth->get ('/') ->to('x#a');
$auth->post('/y')->to('y#b');
$auth->any ('/z')->to('z#c');
надеется, что это поможет кому-нибудь!
(решение найдено здесь:http://mojolicio.us/perldoc/Mojolicious/Routes/Route#under)
Я делаю это так - в полном mojo (не lite) приложение:
на startup
метод
$self->_add_routes_authorization();
# only users of type 'cashier' will have access to routes starting with /cashier
my $cashier_routes = $r->route('/cashier')->over( user_type => 'cashier' );
$cashier_routes->route('/bank')->to('cashier#bank');
# only users of type 'client' will have access to routes starting with /user
my $user_routes = $r->route('/user')->over( user_type => 'client' );
$user_routes->get('/orders')->to('user#orders');
ниже в главном файле приложения:
sub _add_routes_authorization {
my $self = shift;
$self->routes->add_condition(
user_type => sub {
my ( $r, $c, $captures, $user_type ) = @_;
# Keep the weirdos out!
# $self->user is the current logged in user, as a DBIC instance
return
if ( !defined( $self->user )
|| $self->user->user_type()->type() ne $user_type );
# It's ok, we know him
return 1;
}
);
return;
}
надеюсь, это поможет
Я использую этот сценарий в моем приложении:
my $guest = $r->under->to( "auth#check_level" );
my $user = $r->under->to( "auth#check_level", { required_level => 100 } );
my $admin = $r->under->to( "auth#check_level", { required_level => 200 } );
$guest->get ( '/login' )->to( 'auth#login' );
$user ->get ( '/users/profile' )->to( 'user#show' );
после этого все детские маршруты $r
пойдет check_level
подпрограмма:
sub check_level {
my( $self ) = @_;
# GRANT If we do not require any access privilege
my $rl = $self->stash->{ required_level };
return 1 if !$rl;
# GRANT If logged in user has required level OR we raise user level one time
my $sl = $self->session->{ user_level };
my $fl = $self->flash( 'user_level' );
return 1 if $sl >= $rl || $fl && $fl >= $rl;
# RESTRICT
$self->render( 'auth/login', status => 403 );
return 0;
}