使用devise& amp;访问嵌套资源时不会抛出授权异常可以可以

时间:2013-05-27 16:37:01

标签: authentication devise authorization cancan

我使用设计进行身份验证并且可以扫描授权,我正在尝试做一些我认为很简单的事情:我想确保一本书的作者只能编辑他的书。

所以,我有以下routes.rb

resources :authors do
  resources :books
end

ability.rb

class AuthorAbility
  include CanCan::Ability

  def initialize(user)
    can :manage, Book, author_id: user.id
  end
end

我遇到的问题是,如果我尝试编辑其他作者的书,我会期望Cancan抛出一个未经授权的例外。它不是!我得到的只是一个错误如下:

ActiveRecord::RecordNotFound at /api/authors/2/books/1
====================================================

> Couldn't find Book with id=1 [WHERE "books"."author_id" = 4]

(gem) activerecord-3.2.12/lib/active_record/relation/finder_methods.rb, line 341

请注意,虽然我的路线建议我是id = 2的作者,但设计说我是id = 4的作者(来自我的auth_token)。它是否应该抛出异常,因为我不是本书的作者(因此是活动记录异常)?

有没有人遇到过这样的用例并成功解决了?


我的一位朋友指出,我可能没有正确授权资源,所以这就是我所拥有的:

class Api::BooksController < Api::ApiController
  load_and_authorize_resource :book, :through => :current_api_user

在他指出Cancan实际上是通过:current_api_user范围获取记录(因此它首先没有找到该书)之前进行授权。这导致了这个问题。

删除:through选项后,我得到了正确的异常......现在我有:

class Api::BooksController < Api::ApiController
      load_and_authorize_resource :book

希望这有助于任何人。

0 个答案:

没有答案