我的 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
与其他路线没有共同基础的路线不会出现同样的问题。
我目前的解决方法是将 for 的规则放在 for 的下面/objects
,/objects/delete/:id
但这是 a) 不雅,并且 b) 当另一个开发人员编辑文件时会中断。我可以显式禁用在这种情况下看到的嵌套行为吗?