如何设置康康康的能力
How to setup cancancan abilities
无法弄清楚如何用康康康的能力设置我的不同角色。我有一个模型 "Business",其中有许多用户的角色是 :owner、:manager 或 :employee。
我首先尝试做到这一点,如果他们不 belong_to 该业务,他们就看不到该业务的任何内容。其次,我想根据他们所扮演的角色来限制功能。
我想我可以通过使用 if 语句在视图中做到这一点,只向他们展示他们有权访问的东西,但想知道是否有更好的方法使用 cancan
一定要通读 cancan's wiki 因为我不是 100%,但我认为解决方案看起来像这样:
def initialize(user)
user ||= User.new
if user.has_role?(:owner)
can :read, Business, Business.all do |business|
business.id == user.business_id
end
elsif user.has_role?(:whatever)
# etc
end
end
然后按照正常的康康方式检查控制器中的authorize!
。至于在视图中向它们展示适当的功能,您可以在视图中执行一堆 if 语句,或者尝试使用局部变量使它看起来令人愉快,或者检查控制器并根据角色呈现不同的视图,但是,是的,某处一定有 if 语句。
在你的ability.rb
里面
class Ability
include CanCan::Ability
def initialize(user)
alias_action :create, :read, :update, :destroy, :to => :crud
if user
if user.role == "manager"
can :crud, Business, :id => user.business_id
# this will cek whether user can access business instance (id)
elsif user.role == "owner"
can :manage, :all
end
end
end
end
在您的控制器中,您可以通过两种方式进行检查
第 1 步:使用 load_and_authorize_resource,这将自动检查所有 7 rails 方法
class BookingsController < ApplicationController
load_and_authorize_resource
# this before filter will automatically check between users and resource
# rails method here
def show
end
end
第 2 步:在每个方法中使用授权手动检查
def show
@business = Business.find(params[:id])
authorize! :read, @business
end
最好的方法是始终使用 "incremental" 权限。考虑到 cancancan 已经开始假设您的用户没有 Business
的权限,因此您可以根据他们的角色授予他们 "incremental" 权限。
例如:
# give read access if they have any role related to the business
can :read, Business, users: { id: user.id }
# give write access if they are manager
can [:edit, :update], Business, business_users: { role: 'manager', user: { id: user.id } }
# give destroy permissions to owners
can [:destroy], Business, business_users: { role: 'owner', user: { id: user.id } }
无法弄清楚如何用康康康的能力设置我的不同角色。我有一个模型 "Business",其中有许多用户的角色是 :owner、:manager 或 :employee。
我首先尝试做到这一点,如果他们不 belong_to 该业务,他们就看不到该业务的任何内容。其次,我想根据他们所扮演的角色来限制功能。
我想我可以通过使用 if 语句在视图中做到这一点,只向他们展示他们有权访问的东西,但想知道是否有更好的方法使用 cancan
一定要通读 cancan's wiki 因为我不是 100%,但我认为解决方案看起来像这样:
def initialize(user)
user ||= User.new
if user.has_role?(:owner)
can :read, Business, Business.all do |business|
business.id == user.business_id
end
elsif user.has_role?(:whatever)
# etc
end
end
然后按照正常的康康方式检查控制器中的authorize!
。至于在视图中向它们展示适当的功能,您可以在视图中执行一堆 if 语句,或者尝试使用局部变量使它看起来令人愉快,或者检查控制器并根据角色呈现不同的视图,但是,是的,某处一定有 if 语句。
在你的ability.rb
里面class Ability include CanCan::Ability def initialize(user) alias_action :create, :read, :update, :destroy, :to => :crud if user if user.role == "manager" can :crud, Business, :id => user.business_id # this will cek whether user can access business instance (id) elsif user.role == "owner" can :manage, :all end end end end
在您的控制器中,您可以通过两种方式进行检查
第 1 步:使用 load_and_authorize_resource,这将自动检查所有 7 rails 方法
class BookingsController < ApplicationController load_and_authorize_resource # this before filter will automatically check between users and resource # rails method here def show end end
第 2 步:在每个方法中使用授权手动检查
def show @business = Business.find(params[:id]) authorize! :read, @business end
最好的方法是始终使用 "incremental" 权限。考虑到 cancancan 已经开始假设您的用户没有 Business
的权限,因此您可以根据他们的角色授予他们 "incremental" 权限。
例如:
# give read access if they have any role related to the business
can :read, Business, users: { id: user.id }
# give write access if they are manager
can [:edit, :update], Business, business_users: { role: 'manager', user: { id: user.id } }
# give destroy permissions to owners
can [:destroy], Business, business_users: { role: 'owner', user: { id: user.id } }