我最近集成了cancan(1.6.9)到我的Rails(3.2.10)項目進行授權,並且我在手動加載before_filter中的資源時遇到了問題。以下是我的場景的簡要說明。Rails cancan問題與before_filter
在配置/ 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 ,這段代碼將讓我訪問本地主機:3000 /用戶/ 1,但不是本地主機:3000 /用戶。
阻止此訪問的我的cancan ability.rb類中的條目如下所示 - 它是Can not節。如果我評論不能進入,兩個網址都可以工作。
...
can [:show, :update], User, :id => user.id
cannot [:show, :update, :destroy], User do |u|
u.site_id != user.site_id
end
....
應該不會康康舞使用多數民衆贊成手動加載中的before_filter爲節目行動,無論是否PARAMS資源[:id],則存在?有趣的是,如果我修改我的用戶控制器(見下文)以使用skip_load_and_authorize_resource:only =>:show並手動調用授權!在節目行動中,這兩個網址都有效。另外,如果我完全刪除cancan這兩個網址都可以工作。
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解釋,在此情況下工作?
謝謝!
如果您嘗試在'skip_load_and_authorize_resource'工作流中使用'before_filter',會發生什麼? – drewinglis 2013-03-17 07:28:59