使用:attr_accessible和基于角色的授权

时间:2009-04-26 21:20:06

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

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

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

3 个答案:

答案 0 :(得分: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])更改为Order.update_attributes_as_user(params[:order], current_user)并假设您在正确的情况下实施User#can_modify?方法以返回true,它应该可以正常工作。

答案 1 :(得分:3)

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

在一些制作网站上很容易使用。

答案 2 :(得分:1)

是的,您必须修改操作,因此在操作中检查权限。调用Order#update_attributes对普通用户不起作用。

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