Rails用户授权

时间:2010-04-29 02:21:40

标签: ruby-on-rails authorization

我目前正在构建一个Rails应用程序,并试图找出验证用户是否拥有他们试图编辑的任何数据对象的最佳方法。

我已经有一个身份验证系统(restful-authentication),我正在使用一个简单的before_filter来确保用户登录后才能访问网站的某些区域。

但是,我不确定处理用户尝试编辑特定数据的最佳方法 - 例如,假设我网站上的用户可以拥有图书,他们可以编辑图书的属性(标题,作者,页面等),但他们应该只能为他们拥有的书籍做这件事。

在书籍控制器上的“编辑”方法中,我发现只检索了current_user拥有的书籍。但是,如果另一个用户知道书的ID,他们可以键入http://website.com/book/7/edit,控制器将验证他们是否已登录,然后显示该书的编辑页面(似乎绕过控制器)。 / p>

处理此问题的最佳方法是什么?它更像是一个我不理解的Rails约定路由问题(能够直接进入编辑页面),还是应该在before_find,before_save,before_update,after_find等回调到我的模型中添加?

5 个答案:

答案 0 :(得分:2)

这将允许任何更改地址栏中值的人

@book = Book.find(params[:id])

但是如果你经历了登录用户rails(ActiveRecord)的关联会自动更新sql查询

@book = current_user.books.find(params[:id])

当然这假设您的books表有一个user_id列

答案 1 :(得分:2)

您可能需要授权插件。我有一段时间使用this plugin的经验。 This article也有一个概述:

答案 2 :(得分:2)

查看以下宝石:

  • 康康舞
  • 色器件
  • authlogic

并且不要错过Ryan在上面

上的伟大railscasts

答案 3 :(得分:1)

您也可以查看Declarative Authorization

答案 4 :(得分:0)

嘿我最近自己这样做了。最简单的方法是在页面上显示编辑功能,但在以下方法中添加:

  <%if current_user %>
    <% if current_user.id == wishlist.user_id %>
   <div id="text3"><%= link_to 'Edit', edit_wishlist_path(@wishlist) %></div><br />
    <%end%>
   <%end%>

这是你所希望的吗?