如何在Rails中仅对基于模型的特定属性实施基于角色的授权?

时间:2015-02-19 09:47:12

标签: ruby-on-rails authorization

我有一个Accounts资源(模型+控制器)。目前,AccountsController的所有操作都以authorize_admin before_action开头,后者会检查用户是否为管理员,如果不是,则会将用户重定向到{{1} }。

我现在要做的是允许用户编辑自己帐户的某些字段。我不知道该怎么做。我有几个想法:

  1. 在同一个帐户控制器中,使用自定义home_path(Rails 4,强参数)创建自定义edit_personal_accountupdate_personal_account操作。在personal_account_params我将personal_account_params仅允许用户编辑的字段。

  2. 使用正常的休息操作创建新的permit控制器,但仅限PersonalAccountseditupdate。该控制器将再次与show模型进行交互。

  3. 使用Accountcancancan等宝石。我已经浏览了他们的文档和wiki,但到目前为止,我只找到了如何根据角色限制对整个操作的访问的示例,而不是如何限制对特定字段的访问。

  4. 所以我的问题是 - 这三种方式中哪一种最适合我的情景,还有其他更好的方法吗?

1 个答案:

答案 0 :(得分:5)

这样的事情怎么样?

# accounts_controller.rb
before_action :authorize_admin, except: [:edit, :update]

def update
  @account.update(account_params)
end

private

def account_params
  if current_user.admin?
    params.require(:account).permit(<all params>)
  else
    params.require(:account).permit(<subset of params>)
  end 
end

通过这种方式,您可以在account_params方法中明确声明普通用户可以编辑哪些参数,这些参数可能是您想要的,也可能不是。

您还需要根据当前用户的角色隐藏edit视图中的某些字段(例如,如果她是管理员,不隐藏任何内容等),但这应该不是很难。您甚至可以创建一个自定义表单构建器。