如何阻止访问属于其他用户的记录

时间:2011-08-11 10:10:37

标签: ruby-on-rails ruby-on-rails-3 authorization

如何根据会话变量阻止访问特定记录集?

即。我有一个带有user_id键的项目表,如何根据user_id过滤对项目的访问。我不希望有人能够访问/ items / 3 / edit,除非该项目具有针对它的用户ID(基于会话变量)

更新: 我使用@ fl00r建议的答案进行一次更改,使用find_by_id()而不是find(),因为它返回一个nil并且可以处理得非常好:

@item = current_user.items.find_by_id([params[:id]]) || item_not_found

其中item_not_found在应用程序控制器中处理,只会引发路由错误。

2 个答案:

答案 0 :(得分:4)

通过current_user对象提取项目来限制访问权限(User应该:has_many => :items

# ItemsController
def edit
  @item = current_user.items.find(params[:id])
  ...
end

其中current_user有点User.find(session[:user_id])

<强> UPD

有用的Railscast:http://railscasts.com/episodes/178-seven-security-tips,提示#5

答案 1 :(得分:2)

您可以在show / edit / update方法中检查访问权限:

def edit
  @item = Item.find(params[:id])
  restrict_access if @item.user_id != current_user.id
  ....
end

并添加restrict_access方法,例如在application_controller

def restrict_access
  redirect_to root_path, :alert => "Access denied"
end