【问题标题】:ActiveRecord roles with user permissions具有用户权限的 ActiveRecord 角色
【发布时间】:2012-08-21 20:34:29
【问题描述】:

对 Rails 还很陌生,如果我误解了任何内容,请原谅我。我有一个如下所示的用户模型。理想情况下,我想做的是让普通用户只能更新他们的密码,但让管理员能够更改他们的用户名、电子邮件等......

class User < ActiveRecord::Base
  # Default auths
  attr_accessible :password, :password_confirmation, :remember_me
  # Admin auths
  attr_accessible :login, :username, :email, :password, :password_confirmation, :remember_me, :role_ids, :as => :admin
end

要以管理员身份更新记录,我执行以下操作:

@user.update_attributes(params[:user], :as => :admin)

但是假设我想以非管理员身份更新用户记录:

@user.update_attributes(params[:user])

我收到以下异常:

ActiveModel::MassAssignmentSecurity::Error in UsersController#update
Can't mass-assign protected attributes: email, username

我希望忽略不可访问的参数,只更新可访问的属性,而目前整个更新失败。这可能吗?更重要的是,这是推荐的做事方式吗?在调用 update_attributes 之前手动去除不可访问的参数会更好吗?

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 activerecord mass-assignment


    【解决方案1】:

    你可以做的一件事就是设置

    config.active_record.mass_assignment_sanitizer = :logger
    

    这将记录过滤后的属性,而不是抛出ActiveModel::MassAssignmentSecurity::Error

    或者,您可以编写自己的 sanitizer 扩展 ActiveModel::MassAssignmentSecurity::Sanitizer,自定义 process_removed_attributes 以静默失败。

    至于你的其他问题

    ...这是推荐的做事方式吗?在调用 update_attributes 之前手动去除不可访问的参数会更好吗?

    我认为您应该研究为什么您允许提交包含字段的表单,这些字段在提交给某些角色而不是其他角色时会被 Rails 拒绝。例如,如果attr_accessible 的角色省略了该属性,则让普通用户查看/更改表单中的Username 文本字段是没有意义的。

    您应该为非管理员用户隐藏非管理员字段,并保留:strict sanitizer。唯一会引发 ActiveModel::MassAssignmentSecurity::Error 的情况是,如果有人正在修改 DOM,试图提交他们未提供的字段,因此不允许为相关模型修改。

    【讨论】:

    • 感谢 deefour 回答了我的两个问题。实际上,对于普通用户,这些字段将从表单中隐藏,但是可以说我想在页面上有一个禁用/只读表单元素,其中包含不可访问的值?即使用户无法通过正常方式对其进行编辑,它仍然会以 params 结束,从而导致批量分配异常,不是吗?
    • 您将使用disabled 属性标记这些字段;这会阻止它们被提交。
    猜你喜欢
    • 2013-04-15
    • 2011-09-09
    • 1970-01-01
    • 2019-05-03
    • 2011-02-19
    • 2018-10-03
    • 1970-01-01
    • 1970-01-01
    • 2015-11-26
    相关资源
    最近更新 更多