我的 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
的规则放置在 /objects/delete/:id
的规则下方,但这 a) 不优雅,b) 当其他开发人员编辑文件时会中断。我可以明确禁用本例中出现的嵌套行为吗?
嵌套路由部分。
这意味着您有一个 $objects 路由,以及一个从它派生的 $objects_delete 路由。消除排序问题(除了必须先声明较短的路线之外)。