CanCan授权发布索引操作

时间:2018-03-12 09:50:46

标签: ruby-on-rails ruby authorization cancan role-base-authorization

我在尝试使用cancan授权时遇到问题。我的用户每个用户都有一个角色,因此我按照the cancan wiki中的建议添加了user.role列。

我还有一个关于幼儿园的索引视图和另一个儿童索引视图。

我想要实现的目的是只允许使用角色kindergarden或parent(对于孩子)访问相应用户的索引视图。

当我现在在kindergardens控制器中授权Kindergardens时,没有人可以访问索引视图,尽管我在我的能力模型中定义了它。

非常感谢帮助。我不知道我错过了什么......

能力模型:

class Ability
include CanCan::Ability

def initialize(user)
[...]
elsif user.role == 'kindergarden'
   can [:update, :destroy], Kiga do |kiga|
     kiga.user_id == user.id
   end
   can :read, Kiga do |kiga|
     kiga.user_id == user.id
   end
   can :index, Kiga

   can :create, Kiga
else

end

Kindergardens控制器:

class KigasController < ApplicationController
before_action :set_kiga, only: [:show, :edit, :update, :destroy]

# GET /kigas
# GET /kigas.json
def index
  @kigas = Kiga.all
  authorize! :index, @kiga
end

1 个答案:

答案 0 :(得分:1)

您将自己的能力定义为块,并且需要拥有实例。在索引操作中,您只有Active Record范围,而不是实际实例。

顺便说一句,您在控制器代码中输入错字:

def index
  @kigas = Kiga.all
  authorize! :index, @kigas # was @kiga that is nil probably
end

See the docs

  

仅在存在实际实例对象时评估该块。在检查类的权限时(例如在索引操作中),不会对其进行评估。

在这种情况下,您可以使用hashes of conditions

 can [:update, :destroy], Kiga, user_id: user.id