我的移动应用程序有一些自定义的身份验证机制,我在一个名为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
的规则之下,但这是不雅致的,而且当另一个开发人员编辑该文件时,该规则就会中断。我能显式地禁用在这种情况下看到的嵌套行为吗?
发布于 2012-12-02 18:17:43
docs文档似乎表明,您应该在处理较短的对象的对象之外构建扩展路由。请参阅文档的嵌套路由部分。
这意味着您有一个$objects路由,以及一个从它派生的$objects_delete路由。消除排序问题(除了必须先声明较短的路线外)。
https://stackoverflow.com/questions/11576281
复制