如何使用cancancan?

时间:2014-12-08 11:33:16

标签: ruby-on-rails authorization cancancan

我想在rails应用中为用户授予权限。我有'admin'可以创建,更新和删除所有帖子和评论,'user'可以创建和更新他自己的评论,'guest“谁不能做这些。为此,我使用了宝石'devise'和'cancancan'。我理解'设计'宝石,但我不明白'cancancan'。

在class ability.rb中,如何为这些用户(admin,user,guest)写权限?

3 个答案:

答案 0 :(得分:6)

Cancancan只允许您为给定的上下文定义权限。此上下文可能是用户角色,而不是cancancan的一部分,因此角色必须由您自己定义。

有多种方法可以定义用户角色,例如:

  • 作为Role模型,
  • Rails enum
  • 按照建议here
  • 作为User模型的字符串属性。

这完全取决于用例。可以找到如何定义能力的示例here。在您的情况下,它看起来像:

class Ability
  include CanCan::Ability

  def initialize(user)
    user ||= User.new

    if user.reviewer? #Just a logged user
      can :manage, Comment, { owner_id: user.id }
    elsif user.admin?
      can :manage, :all
    end
  end
end

class User < ActiveRecord::Base
  enum role: [ :reviewer, :admin ]
end

答案 1 :(得分:1)

答案 2 :(得分:0)

如果您打算使用Roles,请考虑将CanCanCan与RoleModel(https://github.com/james2m/canard)结合使用的Canard gem(https://github.com/martinrehfeld/role_model)。这为您提供了一种组织良好的方式来规定角色及其能力

例如,如果您有用户模型,则可以按如下方式设置角色:

class User < ActiveRecord::Base
  acts_as_user roles: [:supervisor, :manager, :writer]
end

然后您可以为每个角色创建Ability文件,包括基本用户(未分配任何角色)和Guest(未登录)

Canard::Abilities.for(:user) do
  can  :manage, User, id: user.id
  cannot  [:destroy], User
end

上述内容将允许用户更新自己的信息,但不允许他们自行删除。他们也无法访问任何其他用户记录。