如何根据会话变量阻止访问特定记录集?
即。我有一个带有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在应用程序控制器中处理,只会引发路由错误。
答案 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