如何使用 CanCan 功能授权控制器中的操作?
How to authorise action in a controller using CanCan ability?
我在我的 Rails 项目中使用 CanCan
gem 进行授权。
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
(基于控制器而不是模型)。
我必须添加 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
。
我在我的 Rails 项目中使用 CanCan
gem 进行授权。
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
(基于控制器而不是模型)。
我必须添加 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
。