9

「Mojolicious」アプリケーションで「under」機能を使用する方法のクリーンでシンプルな例を探しています。私が見つけたすべての例は、「Mojolicious :: Lite」(私は使用していません)を扱っています。たとえば、ここhttp://mojocasts.com/e3でスクリーンキャストを聞いたところ、アンダー機能の概念を理解していると思います。でも「Mojolicious::Lite」は使っていないので、直接例を追うことはできないようです。Lite以外のスタイルの例を採用しようとして失敗し続けています。(それはおそらく、私がまだフレームワークに慣れていないためです)

関連するコードは次のようになります。

# 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

4

3 に答える 3

15

Lite-examplesに類似したコードは次のようになります。

# 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

于 2012-10-16T13:17:40.173 に答える
3

私はこのようにやっています-完全なmojo(ライトではない)アプリで:

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

以下のメインアプリファイル:

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

これがお役に立てば幸いです

于 2012-10-16T12:59:59.333 に答える
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;
}
于 2016-12-30T16:39:34.800 に答える