【问题标题】:What's a good way to validate access to models in controller specs?验证对控制器规范中模型的访问的好方法是什么?
【发布时间】:2016-02-10 02:13:28
【问题描述】:
我有Users,它创建了HomeRepairTickets。
Firms 可以为他们感兴趣的HomeRepairTickets 创建TicketBids。
我的控制器规范是否应该确保Firms 只能对他们有权访问的HomeRepairTickets 出价?并确保他们只能updateHomeRepairTickets 他们创建?
或者是否有更好的方法来测试适当的身份验证(例如,id 匹配或 authentication_token 匹配)
我正在使用rspec。
【问题讨论】:
标签:
ruby-on-rails
authorization
tdd
rspec-rails
【解决方案1】:
您应该使用外部授权/基于属性的访问控制 (abac)。
ABAC 是 NIST 定义的授权模型,可让您根据属性和策略来描述授权要求。根据您的问题,您可能希望按照以下方式实施政策
A user can view a ticket if the ticket belongs to the same firm as the user.
使用 ABAC,您可以拥有任意数量的策略。有一个名为 XACML 的标准实现了 ABAC,但我不相信 Ruby 中有任何东西可以实现 XACML。
您最好的选择是为您提供类似功能的 CanCanCan gem。看看here。
【解决方案2】:
您的问题的简短回答是“是”。
“公司只能对他们有权访问的 HomeRepairTickets 进行投标”和“公司只能更新他们创建的 HomeRepairTickets”是很好的功能要求(也称为系统行为)。您绝对应该在这个级别进行测试。
现在,您可能会决定在开发过程中在较低级别进行测试(例如,令牌/ID 匹配等),但最好还是回到测试您的高级需求并确保您的系统符合要求乖巧。
您的身份验证是否存在于控制器中是另一个话题。就像您选择表示身份验证逻辑的方式一样。但是,这都是好东西。