2012-10-16 12 views
8

Poszukuję prostego przykładu użycia funkcji "under" w aplikacji "Mojolicious". Wszystkie przykłady, które znalazłem, dotyczą "Mojolicious :: Lite" (którego nie używam). Na przykład posłuchałem screencastu tutaj http://mojocasts.com/e3 i myślę, że rozumiem koncepcję niższej funkcjonalności. Ale nie używam "Mojolicious :: Lite", więc wydaje mi się, że nie mogę bezpośrednio podążać za przykładem. Nadal nie próbuję zastosować przykładu Lite w stylu innym niż Lite. (To chyba też, bo jestem jeszcze nowy rodzaj ram)Mojolicious Basic Uwierzytelnianie przy użyciu "under" bez Mojolicious :: Lite

Odpowiedni kod wygląda następująco:

# 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'); 

Więc to wszystko trasach muszą być chronione przez użytkownika/hasło. Starałem się zrobić coś takiego:

$r->under = sub { return 1 if ($auth) }; 

Ale to nie skompilować, a ja po prostu nie mogę znaleźć przykład dopasowanie tego kodu styl ... Czy ktoś może mi dać właściwą podpowiedź lub link tutaj? Proszę wybacz mi, jeśli jest to gdzieś w dokumentach ... mogą być kompletne, ale brakuje im zrozumiałych przykładów dla prostych myślących facetów takich jak ja :-P

+1

It wydaje się, że powinienem szukać rozwiązań wykorzystujących "over" lub "bridge" ..? Przykładowy most również używa auth-usecase: http://mojolicio.us/perldoc/Mojolicious/Routes/Route#bridge –

+1

Znalazłem przykład "under" w tym kontekście: http://mojolicio.us/perldoc/Mojolicious/Routes/Route # under –

Odpowiedz

10

Analogiczny kod do Lite-przykładów wygląda następująco:

# 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'); 

Nadzieje to pomaga nikomu!

(Rozwiązanie znaleźć tutaj: http://mojolicio.us/perldoc/Mojolicious/Routes/Route#under)

3

Robię to w ten sposób - w pełnym mojo (nie lite) aplikacja:

w metodzie

$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'); 

poniżej w głównym pliku aplikacji startup:

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

mam nadzieję to pomaga

+1

Dzięki za podpowiedź, że "over" może być tutaj użyte. –

0

używam ten scenariusz w mojej aplikacji:

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'); 

Po tym wszystkim dzieciom dróg $r przejdzie check_level podprogramu:

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; 
} 
Powiązane problemy