【问题标题】:Rails: Make model to read and edit only own data by CanCanCanRails:使模型只能通过 CanCanCan 读取和编辑自己的数据
【发布时间】:2015-03-21 13:42:10
【问题描述】:

我有 AdminPartner 模型。 Partner has_many Services。我正在使用设计和 CanCanCan。我在application_controller 中设置了我的默认值:

# This is for changing defaults for CanCanCan
 def current_ability
   if admin_signed_in?
     @current_ability ||= Ability.new(current_admin)
   elsif partner_signed_in?
     @current_ability ||= Ability.new(current_partner)
 end
end

现在在我的Abilities 班级里:

case model
  # if model is Admin
  when Admin
    can :manage, :all

  # if model is Partner
  when Partner
    can :read, Partner, id: model.id

    can :manage, Service, partner_id: model.id, partner: {active: true}
    can :create, Service

    can :update, Partner, id: model.id, active: true


  else
    cannot :read, :all
end

model 是我创建的参数,而不是旧的user。我在视图中放置了很多if can? 条件。

现在问题来了:根据谁登录,如何结合DeviseCanCanCan 限制对pages and controllers 的访问?

我想我会为每个控制器添加类似的东西:

before_action :check_logged_in

def check_logged_in
    if partner_signed_in?
       # do something
    elsif admin_signed_in?
       # do something
    end
end

但这会使CanCanCan 变得毫无用处,并且如果我有太多控制器将难以维护。

我认为我应该为我的控制器使用load_and_authorize_resource,但我只有AdminPartner具有设计授权的模型,并且有很多模型的控制器不需要任何授权甚至没有模型.

【问题讨论】:

  • 我们指的是服务页面?或者还有其他型号吗?
  • 是的,合作伙伴有很多服务并且可以创建它们。我认为未来会有更多的模型

标签: ruby-on-rails ruby devise cancan


【解决方案1】:

好吧,我不知道如何在所有模型上执行此操作,但您可以像这样对每个模型制定规则

when Partner
  can :manage, Service, user_id: user.id

这将只允许合作伙伴管理服务where(user_id: current_user.id)

【讨论】:

  • can :manage, Service, partner_id: model.id 不是更正确吗?另外,我将如何限制对不应出现 partner 的页面的访问?
  • 第一个user_id指的是服务模型中的字段,可能是你说的partner_id,第二个user是当前应该初始化的用户能力档案的
  • 如果我不提一些动作,会被认为是cannot?
  • 所有东西默认都是一个cannot,你只是can的白名单,cannot存在的原因是你可以can一个巨大的集合和cannot它们的子集,例如 can :manage 然后添加 cannot :destroy
  • 如何限制对某些页面的访问?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-23
  • 1970-01-01
  • 1970-01-01
  • 2015-11-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多