2012-10-16 2 views
8

"Mojolicious"응용 프로그램에서 "under"기능을 사용하는 방법에 대한 간단하고 명확한 예를 찾고 있습니다. 내가 찾은 모든 예제는 "Mojolicious :: Lite"(내가 사용하지 않음)를 다루고 있습니다. 예를 들어 여기 화면 캐스트를 듣고 http://mojocasts.com/e3과 나는 under functional의 개념을 이해한다고 생각합니다. 하지만 "Mojolicious :: Lite"는 사용하지 않으므로 예제를 직접 따라갈 수없는 것 같습니다. 나는 Lite 스타일이 아닌 Lite 예제를 채택하는 데 계속 실패하고 있습니다.Mojolicious :: Under가 아닌 Mojolicious :: Lite를 사용하는 기본 인증

관련 코드는 다음과 같습니다 (I 프레임 워크에 아직 가지 새로운이기 때문에 그것도 아마) :

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

는하지만이 컴파일되지 않습니다 난 그냥이 코드 스타일을 일치하는 예를 찾을 수 없습니다 ... 아무도 나에게 올바른 힌트 나 여기에 링크를 줄 수 :이 그런 짓을하려고? 그리고 이것은이 문서의 어딘가에있는 경우가 완료 될 수 ... 용서하지만, 내가 이런 식으로 일을하고

+1

그것을 :

(http://mojolicio.us/perldoc/Mojolicious/Routes/Route#under 솔루션은 여기) "over"또는 "bridge"를 사용하여 솔루션을 찾아야하는 것처럼 보입니다. 또한 bridge-example은 auth-usecase를 사용합니다. http://mojolicio.us/perldoc/Mojolicious/Routes/Route#bridge –

+1

이 컨텍스트에서 "under"에 대한 예제를 발견했습니다. http://mojolicio.us/perldoc/Mojolicious/Routes/Route # 아래에 –

답변

10

을하는 데 도움이 :

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

희망이 사람을 도와줍니다!

3

- P 나 같은 단순한 생각을 가진 사람에 대한 이해 예 부족하시기 바랍니다 - 전체 모조에 (라이트되지 않음) 응용 프로그램 : 나는 희망

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 방법의 주요 응용 프로그램 파일에 아래

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

에서

이 라이트 - 예와 유사한 코드는 다음과 같습니다

+1

"over"를 사용할 수 있다는 힌트를 주셔서 감사합니다. –

0

내가 내 응용 프로그램에서이 시나리오를 사용

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; 
} 
관련 문제