2

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

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

4

3 回答 3

4

一般来说, 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])toOrder.update_attributes_as_user(params[:order], current_user)并假设您实现了User#can_modify?在正确情况下返回 true 的方法,它应该可以工作。

于 2009-04-27T08:55:16.333 回答
3

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

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

于 2010-08-26T15:39:43.957 回答
1

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

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

于 2009-04-26T21:46:43.307 回答