2016-03-08 46 views
0

我在我的Rails項目中使用CanCan gem進行授權。如何授權使用CanCan功能的控制器中的操作?

ability.rb文件看起來是這樣的:

class Ability 
    include CanCan::Ability 

    def initialize(user) 
    @user = user || User.new 
    send @user.role.name.underscore unless @user.role.nil? 
    end 

    private 

    def partneradmin 
    can :manage, :all 
    cannot :access, User, role_id: @user.role.id 
    cannot :manage, Watchlist 
    can :manage, Attachment 
    end 

end 

我有另一個控制器controllers/admin/users_controller.rb它看起來像:

class Admin::UsersController < AdminController 

    load_and_authorize_resource 

    respond_to :html, :json 

    def index 
    end 

    def new 
    end 
end 

現在我想限制訪問Admin::UsersController#index行動,以便partneradmin用戶無法訪問那個行動。我試圖添加cannot :access, Admin::UsersController,但沒有運氣,因爲我仍然可以訪問Admin::UsersController#index頁面。

請注意,我不想限制所有用戶資源的訪問權限。例如我有PartnerAdmin::UsersController#index,我不想限制它,但僅限於Admin::UsersController#index(基於控制器而不是型號)。

+0

什麼是rails版本? 'rails -v' – Fresz

+0

@Fresz Rails 4.1.1。 –

+0

當你擁有'用戶'對象時,你怎麼能確定用戶是否是'partneradmin'?我有一個'user.is_partneradmin?'方法嗎?它是數據庫中的布爾字段嗎? –

回答

0

我不得不添加cannot :index, AdminController所以ability.rb看起來:

def partneradmin 
    can :manage, :all 
    cannot :access, User, role_id: @user.role.id 
    cannot :manage, Watchlist 
    can :manage, Attachment 
    cannot :index, AdminController 
    end 

然後在控制器添加authorize_resource :class => AdminController