【问题标题】:Rails cancan issue with before_filterRails canscan 与 before_filter 相关的问题
【发布时间】:2013-03-17 21:30:26
【问题描述】:

我最近将 cancan (1.6.9) 集成到我的 Rails (3.2.10) 项目中以进行授权,但在 before_filter 中手动加载资源时遇到问题。这是我的场景的简要说明。

在 config/routes.rb 中,我有以下条目...

resources :users
match '/profile', :to => 'users#show'

这是我的 users_controller.rb 的样子...

class UsersController < ApplicationController
  before_filter :load_show_resource, :only => :show
  load_and_authorize_resource
  ...
  def show
  end
  ...
  private

    def load_show_resource
      @user = params[:id] ? User.find(params[:id]) : current_user
    end
end

如果我的 current_user 的 id 为 1,此代码将允许我访问 localhost:3000/users/1 但不能访问 localhost:3000/profile。

我的 cancan ability.rb 类中阻止此访问的条目如下所示 - 它是 cancan 部分。如果我注释掉无法条目,两个网址都可以工作。

...
can [:show, :update], User, :id => user.id
cannot [:show, :update, :destroy], User do |u|
  u.site_id != user.site_id
end
....

无论 params[:id] 是否存在,是否都不能使用在 before_filter 中手动加载的资源进行 show 操作?

有趣的是,如果我修改我的用户控制器(见下文)以使用 skip_load_and_authorize_resource :only => :show 并手动调用授权!在表演动作中,两个网址都有效。另外,如果我完全删除 cancan,两个 url 都可以工作。

class UsersController < ApplicationController
  load_and_authorize_resource
  skip_load_and_authorize_resource :only => :show
  ...
  def show
    @user = params[:id] ? User.find(params[:id]) : current_user
authorize! :show, @user
  end
  ...
  private

    def load_show_resource
      @user = params[:id] ? User.find(params[:id]) : current_user
    end
end

所以,我的问题是,为什么 cancan documentation 中的覆盖加载中解释的内容在这种情况下不起作用?

谢谢!

【问题讨论】:

  • 如果您尝试将before_filterskip_load_and_authorize_resource 工作流一起使用会怎样?

标签: ruby-on-rails ruby-on-rails-3 cancan


【解决方案1】:
# controller

class UsersController < ApplicationController
  load_and_authorize_resource, :except => :show
  # skip_load_and_authorize_resource :only => :show
  ...
  def show
    @user = params[:id] ? User.find(params[:id]) : current_user
    authorize! :show, @user
  end
  ...
end

# ability.rb

can [:show, :update, :destroy], User do |u|
  u.id == user.id && u.site_id == user.site_id
end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-07
    • 1970-01-01
    • 1970-01-01
    • 2016-10-21
    • 1970-01-01
    • 2011-03-06
    相关资源
    最近更新 更多