使用 :attr_accessible 进行基于角色的授权

发布于 2024-07-17 14:13:05 字数 270 浏览 5 评论 0原文

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

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

In my online store, users are allowed to change certain properties of their orders (e.g., their billing address), but not others (e.g., the origination ip address). Administrators, on the other hand, are allowed to modify all order properties.

Given, this, how can I use :attr_accessible to properly secure my Order model? Or will I have to use it to mark accessible all attributes that administrators can modify and refrain from using Order.update_attributes(params[:order]) in those controller actions that ordinary users can access?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

驱逐舰岛风号 2024-07-24 14:13:05

一般来说,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,它应该可以工作。

Generally speaking, attr_accessible is not the tool you're looking for and Rails doesn't come with anything built in that does what you want.

If you want fine-grained control over who can update specific attributes in a model, you could do something like:

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

Then you can change your Order.update_attributes(params[:order]) to Order.update_attributes_as_user(params[:order], current_user) and assuming you implement the User#can_modify? method to return true in the correct cases, it should work.

戒ㄋ 2024-07-24 14:13:05

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

很简单,在一些制作网站中使用。

I had the same problem and now I'm using this gem http://github.com/dmitry/attr_accessible_block

It's easy and used in some production website.

巾帼英雄 2024-07-24 14:13:05

是的,您必须修改操作,以便在操作内检查权限。 调用Order#update_attributes对一般用户不起作用。

我不记得有一个基于角色的授权插件可以实现您正在寻找的功能。 这是因为这些插件混合到控制器而不是模型。 他们还需要混合到 ActiveRecord::Base 中以检查 attr_accessible 等。

Yes, you'll have to modify the actions, so permissions are checked inside the actions. Calling Order#update_attributes will not work for the general user.

I can't rember a role-based authorization plugin that would allow something you are looking for. This is because these plugins mixin to the controllers and not the models. They would also need to mixin into ActiveRecord::Base to check for attr_accesible etc.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文