【问题标题】:How to pass additional parameters to `under` subroutine in Mojolicious?如何将附加参数传递给 Mojolicious 中的“under”子例程?
【发布时间】:2017-02-17 14:47:17
【问题描述】:

我有两条路线:

$auth =  $r->under( \&auth );
$auth->get( "/test",   { level => 'user' }  )->to( "C#A1" );
$auth->get( "/secure", { level => 'admin' } )->to( "C#A2" );

我使用under 来检查访问级别。但是当auth 子程序被调用时,它还没有{level} 值。 { level } 仅在操作时可用。

如何更好地传递到目标路由所需的用户级别 &auth 函数?

【问题讨论】:

    标签: perl mojolicious


    【解决方案1】:

    我找到了答案。我应该使用stack 方法:

    sub auth {
        ...
        return 1   if $c->match->stack->[-1]{ level } <= $user->level;
    }
    

    它包含:

    [
      { api => 1, cb => sub { ... } },                     # stash at &auth
      { api => 1, cb => sub { ... }, level => "user" },    # stash at &C#A*
    ]
    

    【讨论】:

      【解决方案2】:

      另一种方法是让 level 成为一个单独的 sub 来设置 level 并将其用于路由。

      my $user  = $r->under('/user' )->to('auth#check_user' );
      my $admin = $r->under('/admin')->to('auth#check_admin');
      $user ->get("/test"  )->to("C#A1");
      $admin->get("/secure")->to("C#A2");
      

      此示例将让您的路线为/user/test 和/admin/secure。不确定这是否是您正在寻找的。​​p>

      【讨论】:

      • 会有/user/admin/secure。请检查您的代码
      • 我有这个案例。但在我看来,这不是一个好方法,因为在两个地方进行权限检查看起来不安全
      猜你喜欢
      • 2021-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-03
      • 2016-11-22
      相关资源
      最近更新 更多