我正在使用Dancer处理CRUD应用程序。我需要做的一件事是检查用户是否有权执行POST(创建)和PUT(更新)/删除(删除)操作。
我已经阅读了Dancer文档中的before
个钩子,但一直无法找出执行不同类型授权的最佳方法。
对于POST操作,我想要做的就是检查是否已经随请求提交了有效的API密钥,但是对于PUT / DELETE操作,我想检查提交的API密钥是否与附加的用户匹配到要更新或删除的记录。
我理解如何检查API密钥背后的逻辑,但我想知道钩子(或其他东西)是否允许我调用该逻辑而无需为每个PUT添加相同的样板函数调用/ POST / DELETE功能在每条路线上。
答案 0 :(得分:3)
我不确定这是否是一个非常优雅的解决方案,但我认为它应该有用。
答案 1 :(得分:1)
根据经验,这是对此问题的另一种看法:
由于Dancer没有机会在'之前'之前解析您的输入参数。如果您的应用程序允许以各种方式提供它们,则可能无法以一致的方式读取您的身份验证凭据。
特别是,如果你使用输入参数来传递一个随机数以防止CSRF攻击(你应该考虑它!),你就不会有一致的方法来获得那个随机数。您可以在'之前进行自己的迷你参数解析,但这也可能很混乱。
我在前一段时间处理应用程序时遇到了这个问题,并且记得必须在每个PUT / POST / DELETE路由中添加可怕的样板认证功能。然后,如果您正在执行此操作,则检查request-> is_post变得无关紧要,因为您已经决定是否在路由中放置样板认证功能。
答案 2 :(得分:-1)
我还没有尝试过,但是可以在Route基类中处理先决条件,然后传递成功。一旦您的基类验证了身份验证,这将使您的特定包正常处理请求。
操作可以选择不提供当前请求,并要求Dancer使用下一个匹配的路径处理请求。这是通过pass关键字完成的,如下例
get '/say/:word' => sub {
return pass if (params->{word} =~ /^\d+$/);
"I say a word: ".params->{word};
};
get '/say/:number' => sub {
"I say a number: ".params->{number};
};