【问题标题】:Using :attr_accessible with role-based authorization将 :attr_accessible 与基于角色的授权一起使用
【发布时间】:2010-10-21 22:55:00
【问题描述】:

在我的在线商店中,用户可以更改其订单的某些属性(例如,他们的帐单地址),但不能更改其他属性(例如,原始 IP 地址)。另一方面,管理员可以修改所有订单属性。

鉴于此,我如何使用:attr_accessible 正确保护我的订单模型?或者我是否必须使用它来标记管理员可以修改的所有属性,并避免在普通用户可以访问的控制器操作中使用Order.update_attributes(params[:order])

【问题讨论】:

    标签: ruby-on-rails security security-roles


    【解决方案1】:

    是的,您必须修改操作,因此在操作内检查权限。普通用户无法拨打Order#update_attributes

    我无法记住一个基于角色的授权插件,它允许您正在寻找的东西。这是因为这些插件混合到控制器而不是模型中。他们还需要混入ActiveRecord::Base 以检查attr_accesible 等。

    【讨论】:

      【解决方案2】:

      一般来说,attr_accessible 不是您要寻找的工具,而且 Rails 没有内置任何可以满足您需求的工具。

      如果您想对谁可以更新模型中的特定属性进行细粒度控制,您可以执行以下操作:

      class Order < ActiveRecord::Base
        def update_attributes_as_user(values, user)
          values.each do |attribute, value|
            # Update the attribute if the user is allowed to
            @order.send("#{attribute}=", value) if user.can_modify?(attribute)
          end
          save
        end
      end
      

      然后您可以将Order.update_attributes(params[:order]) 更改为Order.update_attributes_as_user(params[:order], current_user) 并假设您实现User#can_modify? 方法以在正确的情况下返回true,它应该可以工作。

      【讨论】:

      【解决方案3】:

      我遇到了同样的问题,现在我正在使用这个 gem http://github.com/dmitry/attr_accessible_block

      它很容易在一些生产网站中使用。

      【讨论】:

      • 谢谢!这是最好的解决方案。
      猜你喜欢
      • 2018-11-01
      • 1970-01-01
      • 2022-01-01
      • 2021-11-22
      • 2020-02-16
      • 1970-01-01
      • 2017-12-14
      • 2017-04-12
      相关资源
      最近更新 更多