什么是验证控制器规格中模型访问权限的好方法?

时间:2016-02-10 02:13:29

标签: ruby-on-rails authorization tdd rspec-rails

Users创建了HomeRepairTickets

Firms可以为他们感兴趣的TicketBid创建HomeRepairTicket个。

我的控制器规格是否应该确保Firm只能对他们有权访问的HomeRepairTicket出价?并确保他们只能update HomeRepairTicket他们创建的?

或者是否有更好的方法来测试适当的身份验证(例如,id匹配或authentication_token匹配)

我正在使用rspec

2 个答案:

答案 0 :(得分:0)

您应该使用外部授权/基于属性的访问控制()。

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

答案 1 :(得分:0)

对你的问题的简短回答是'是'。

“公司只能对他们有权访问的HomeRepairTickets出价”和“公司只能更新他们创建的HomeRepairTickets”是很好的功能要求(也就是系统行为)。你绝对应该在这个级别进行测试。

现在,您可能决定在开发过程中进行较低级别的测试(例如,令牌/ ID匹配等),但回到测试您的高级要求并确保您的系统是乖巧。

您的身份验证是否存在于控制器中是另一个主题。与您选择表示身份验证逻辑的方式相同。但是,这都是好事。