2012-10-16 25 views
8

"Mojolicious" uygulamasında "under" işlevinin nasıl kullanılacağına dair basit ve temiz bir örnek arıyorum. Bulduğum tüm örnekler "kullanmadığım Mojolicious :: Lite" ile ilgili. Örneğin, buradaki screencast'ı http://mojocasts.com/e3 dinledim ve sanırım altta yatan işlevsellik kavramını anlıyorum. Ama ben "Mojolicious :: Lite" kullanmıyorum, bu yüzden direkt olarak örneği takip edemiyorum. Lite dışı tarzı için Lite-örneklerini benimsemeyi denemeye devam ediyorum.Mojolicious :: Lite olmadan "under" kullanarak Mojolicious Temel Kimlik Doğrulaması: Lite

ilgili kod şöyle görünür (Ben çerçeveye hala tür yeni olduğum için de muhtemelen):

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

Yani bütün bunlar yollarının/geçmesine kullanıcı tarafından korunan gerekir.

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

Ancak bu derleme değil ve sadece bu kod tarzı eşleşen bir örnek bulamıyorum ... herkes bana doğru ipucu veya buraya linki verebilir: Böyle bir şey yapmaya çalıştık? Ve bu dokümanlarda bir yer varsa lütfen beni affedin ... tam olabilir, ama benim gibi basit fikirli insanlar için anlaşılabilir örneklerden yoksundurlar: -P

+1

It:

(http://mojolicio.us/perldoc/Mojolicious/Routes/Route#under Çözüm burada bulabilirsiniz) "over" veya "bridge" kullanarak çözümler aramalıyım gibi görünüyor ...? Köprü örneği ayrıca bir auth-usecase kullanır: http://mojolicio.us/perldoc/Mojolicious/Routes/Route#bridge –

+1

Bu bağlamda "under" için bir örnek buldum: http://mojolicio.us/perldoc/Mojolicious/Routes/Route # –

cevap

10

yardımcı olur:

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

Umutlar bu kimseyi yardımcı olur!

3

Bunu böyle yapıyorum - tam bir mojoda (lite değil) uygulaması: umarım

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

: startup yöntemle ana uygulama dosyasında aşağıdaki

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

yılında

Bu Lite-örneklere benzer kod şuna benzer

+1

altındaki "Burada" ipucu için kullanabileceğiniz ipucu için teşekkürler. –

0

benim uygulamada bu senaryoyu kullanın:

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 bu tüm çocukların rotalarından check_level Değişmeze üzerinden gidecek:

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; 
} 
İlgili konular