如何设置cancancan功能

时间:2017-07-18 05:30:47

标签: ruby-on-rails cancancan rolify

无法确定如何使用cancancan功能设置我的不同角色。我有一个模特"商业"其中有许多用户具有以下任一角色:所有者,经理或:员工 我试图首先说明,如果他们不属于那个企业,他们就无法看到该业务的任何内容。第二,我想根据他们的角色来限制功能。

我想我可以通过使用if语句在视图中执行此操作,只显示他们可以访问的内容,但想知道cancan是否有更好的方法

3 个答案:

答案 0 :(得分:1)

  • 在你的能力范围内.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
    
在控制器内部,你可以用2种方式进行检查

  1. 第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. 第2步:在每个方法中手动检查授权

    def show
      @business = Business.find(params[:id])
      authorize! :read, @business
    end
    

答案 1 :(得分:0)

绝对仔细阅读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

然后以正常的cancan方式检查控制器中的authorize!。至于在视图中显示它们适当的功能,您可以在视图中执行一堆if语句,也可以尝试使用partials使其看起来很可口,或者检查控制器并根据角色呈现不同的视图,但是,是的,在某处必须有陈述。

答案 2 :(得分:0)

最好的方法是始终使用“增量”权限。考虑到cancancan已经开始假设你的用户没有Business的权限,所以你可以根据他们的角色给他们“增量”权限。

一个例子是:

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