【问题标题】:In rails4 having many models, using cancancan gem, grant access to specific user to a specific model only?在具有许多模型的rails4中,使用cancancan gem,仅授予特定用户对特定模型的访问权限?
【发布时间】:2015-12-18 06:26:35
【问题描述】:

我的 rails 4 应用程序中有 5 个模型,并且使用 cancancan gem,我希望仅授予特定用户对特定模型的访问权限。

这意味着:

  • 允许user1访问1,2模型

  • 允许用户 2 访问 3,4 模型

  • 允许用户 3 访问所有模型。

请指导我。

【问题讨论】:

  • 这没有任何意义。用户不能“访问”模型。向您的应用发出请求的客户端与控制器进行交互。控制器将请求转换为模型层上的某种调用,由您来定义交互是什么。

标签: ruby-on-rails ruby devise cancancan


【解决方案1】:

您应该使用rolify with cancan 来完成此操作。您可以使用 rolify 分配某个角色来代表您的“用户 1”或“用户 2”,如下所示:

user = User.find(1)
user.add_role :limited_user_1

而您有权访问所有内容的“用户 3”可以是管理员

user = User.find(3)
user.add_role :admin

然后使用cancan 就像检查user 是否具有指定的role 一样简单。在这种情况下:manage 表示user 可以访问所有操作,例如:read、:create、:update、:destroy。

class Ability
  include CanCan::Ability

  def initialize(user)
    user ||= User.new # guest user (not logged in)
    if user.admin?
      can :manage, :all
    elsif user.limited_user_1?
      can :manage, :model_1
      can :manage, :model_2
    elsif user.limited_user_2?
      can :manage, :model_3
      can :manage, :model_4
    end
  end
end

【讨论】:

  • 这是我认为的答案
【解决方案2】:

Mike 的答案的简单版本如下:

#app/models/ability.rb
class Ability
  include CanCan::Ability

  def initialize(user)
    user ||= User.new # guest user (not logged in)
    case user.role_id
      when 1
         can :read, Model
         can :read, Model2
      when 2
         can :read, Model3
         can :read, Model4
      when 3 
         can, :manage, :all
    end
  end    
end

您必须添加一种方法来定义User 是否为1、2、3 等,这就是Mike 建议rolify 的原因。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-17
    • 1970-01-01
    • 1970-01-01
    • 2023-04-11
    • 2014-02-18
    • 2021-10-06
    • 1970-01-01
    • 2016-12-20
    相关资源
    最近更新 更多