2013-03-17 77 views
0

我最近集成了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解釋,在此情況下工作?

謝謝!

+0

如果您嘗試在'skip_load_and_authorize_resource'工作流中使用'before_filter',會發生什麼? – drewinglis 2013-03-17 07:28:59

回答

0
# 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