2012-10-16 14 views
8

के बिना "अंडर" का उपयोग करके Mojolicious Basic प्रमाणीकरण मैं एक "Mojolicious" अनुप्रयोग में "नीचे" कार्यक्षमता का उपयोग करने के तरीके के बारे में एक स्वच्छ और सरल उदाहरण की तलाश में हूं। मुझे मिले सभी उदाहरण "Mojolicious :: लाइट" (जो मैं उपयोग नहीं करता) से निपट रहे हैं। उदाहरण के लिए मैंने स्क्रीनकास्ट को http://mojocasts.com/e3 पर सुना और मुझे लगता है कि मैं निम्न कार्यक्षमता की अवधारणा को समझता हूं। लेकिन मैं "Mojolicious :: लाइट" का उपयोग नहीं करता, इसलिए ऐसा लगता है कि मैं सीधे उदाहरण का पालन नहीं कर सकता। मैं गैर-लाइट शैली के लिए लाइट-उदाहरण को अपनाने की कोशिश में विफल रहता हूं। (यह शायद इसलिए भी कि मैं अभी भी ढांचे के लिए एक तरह से नई हूँ)Mojolicious :: लाइट

प्रासंगिक कोड इस तरह दिखता है:

# 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

+1

यह ऐसा लगता है कि मुझे "ओवर" या "ब्रिज" का उपयोग करके समाधान की तलाश करनी चाहिए ..? पुल-उदाहरण भी ऑथ-यूकेकेस का उपयोग करता है: http://mojolicio.us/perldoc/Mojolicious/Routes/Route#bridge –

+1

मुझे इस संदर्भ में "अंडर" के लिए एक उदाहरण मिला: http://mojolicio.us/perldoc/Mojolicious/रूट/रूट # –

उत्तर

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

होप्स इस किसी को भी मदद करता है!

(समाधान मिला: http://mojolicio.us/perldoc/Mojolicious/Routes/Route#under)

3

मैं इसे इस तरह कर रहा हूं - एक पूर्ण मोजो में (लाइट नहीं) अनुप्रयोग:

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

के संकेत के लिए धन्यवाद कि "ओवर" का उपयोग यहां किया जा सकता है। –

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; 
} 
संबंधित मुद्दे