2012-10-16 20 views
8

Tôi đang tìm một ví dụ đơn giản và rõ ràng về cách sử dụng chức năng "dưới" trong ứng dụng "Mojolicious". Tất cả các ví dụ tôi tìm thấy được đối phó với "Mojolicious :: Lite" (mà tôi không sử dụng). Ví dụ tôi đã nghe màn hình ở đây http://mojocasts.com/e3 và tôi nghĩ rằng tôi hiểu khái niệm về chức năng dưới. Nhưng tôi không sử dụng "Mojolicious :: Lite", vì vậy có vẻ như tôi không thể làm theo ví dụ trực tiếp. Tôi tiếp tục không cố gắng áp dụng ví dụ Lite cho phong cách không phải Lite. (Đó là lẽ cũng vì tôi vẫn còn loại mới để khuôn khổ)Xác thực cơ bản Mojolicious bằng cách sử dụng "dưới" mà không có Mojolicious :: Lite

Mã liên quan như sau:

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

Vì vậy, tất cả các tuyến đường này cần phải được bảo vệ bởi user/pass. Tôi cố gắng để làm một cái gì đó như thế này:

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

Nhưng điều này không biên dịch và tôi chỉ không thể tìm thấy một ví dụ phù hợp này mã phong cách ... thể ai cho tôi gợi ý đúng hay liên kết ở đây? Và hãy tha thứ cho tôi nếu điều này ở đâu đó trong tài liệu ... chúng có thể hoàn thành, nhưng chúng thiếu các ví dụ dễ hiểu đối với những người có đầu óc đơn giản như tôi :-P

+1

Nó có vẻ như tôi nên tìm giải pháp bằng cách sử dụng "over" hoặc "bridge" ..? Ví dụ bridge cũng sử dụng auth-usecase: http://mojolicio.us/perldoc/Mojolicious/Routes/Route#bridge –

+1

Tôi tìm thấy một ví dụ cho "under" trong ngữ cảnh này: http://mojolicio.us/perldoc/Mojolicious/Routes/Route # dưới –

Trả lời

10

Mã tương tự như Lite-ví dụ như sau:

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

Hy vọng điều này giúp bất cứ ai!

(Giải pháp tìm thấy ở đây: http://mojolicio.us/perldoc/Mojolicious/Routes/Route#under)

3

Tôi làm như thế - trong mojo đầy đủ (không lite) ứng dụng:

trong startup phương pháp

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

dưới đây trong file ứng dụng chính:

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

tôi hy vọng điều này giúp

+1

Cảm ơn gợi ý rằng "over" có thể được sử dụng ở đây. –

0

tôi sử dụng kịch bản này trong ứng dụng của tôi:

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

Sau đó tất cả trẻ em đường của $r sẽ đi qua check_level chương trình con:

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