为什么Mojolicious筑巢我的路线?

时间:2012-07-20 09:07:50

标签: perl mojolicious

我的Mojolicious应用程序有一些自定义身份验证机制,我在名为auth_permission的路由条件中实现:

$app->add_condition(auth_permission => sub {
    return is_user_allowed(...) ? 1 : 0;
});

所以我的路线看起来像这样:

my $r = $app->routes;

$r->get('/prefs')
    # no permission necessary here
  ->to(...);

$r->get('/objects')
  ->over(auth_permission => 'view objects')
  ->to(...);

$r->get('/objects/delete/:id')
  ->over(auth_permission => 'delete objects')
  ->to(...);

正确处理to()子句:GET /objects为我提供了对象列表,GET /objects/delete/42删除了对象42。

问题在于,对两个请求都检查了权限view objects,即使第二个路由应该检查权限delete objects

原因似乎是/objects/delete/42/objects以下的路径。路由/prefs不会出现同样的问题,它与其他路由没有共同的基础。

我目前的解决方法是将/objects 的规则放在<{1}}下面的<{1}},但这是一个不优雅的b)在其他开发人员编辑时会中断文件。我可以明确禁用在这种情况下看到的嵌套行为吗?

1 个答案:

答案 0 :(得分:1)

Mojolicious文档似乎表明你应该在处理较短的对象的对象上构建扩展路径。请参阅文档的Nested Routes部分。

这意味着你有一个$ objects路由,以及一个从它派生的$ objects_delete路由。消除排序问题(除了必须先声明更短的路线)。