使用 :attr_accessible 进行基于角色的授权
在我的在线商店中,用户可以更改其订单的某些属性(例如,他们的帐单地址),但不能更改其他属性(例如,原始 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
一般来说,attr_accessible 不是您正在寻找的工具,并且 Rails 没有内置任何可以完成您想要的功能的工具。
如果您想要细粒度控制谁可以更新模型中的特定属性,您可以执行以下操作:
然后您可以将
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:
Then you can change your
Order.update_attributes(params[:order])
toOrder.update_attributes_as_user(params[:order], current_user)
and assuming you implement theUser#can_modify?
method to return true in the correct cases, it should work.我遇到了同样的问题,现在我正在使用这个 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.
是的,您必须修改操作,以便在操作内检查权限。 调用
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 forattr_accesible
etc.