Rails应用程序中的项目/微博的CRUD所有权

我有一个简单的rails应用程序,用户可以在其中创建“项目”,但在列出所有项目的主索引页面上,每个“项目”旁边都有“显示,编辑和删除”链接。 我知道这是因为我使用脚手架来完成这些项目,但我想确保人们只能编辑他们创建的项目。 这个逻辑现在略高于我的头脑,就像我之前说过的那样,对于铁轨来说我是全新的。

用户控制器:

class UsersController < ApplicationController def show @user = User.find_by_username(params[:id]) end def index @user = User.find(:all) end end 

主项目视图:

 

All Items

Title Details Inquire
"michaelomchenry@gmail.com", :subject => "OverFlow Inquiry Regarding " + item.title %>

商品型号:

 class Item  { :maximum => 140 } belongs_to :user delegate :email, to: :user end 

那里有很多东西。 首先,为了能够根据用户过滤项目(或操作),您需要知道当时登录的人员,从而使用户能够登录。 这可以通过例如使用Devise (Rails的授权gem)来完成。 设计很大程度上被使用并且有很好的记录

设置Devise后,您可以检查用户是否已记录(例如使用before_filter ),Devise将创建一个“current_user”变量供您使用(这在Devise教程中显示 )。 然后,您可以使用它来过滤项目列表,例如:

 editable_items = current_user.items 

然后在视图中使用editable_items。 我建议你去阅读Devise教程,因为你正在做的是一个非常常见且记录良好的任务。

如果可以,我会发表意见,但我觉得必须参考@momchenr发布的答案(回答他们自己的问题)作为所选答案的后续行动。

@momcher写道:

我最终这样做了:

 <% if item.email == current_user.email %> 

它有用……是吗?

可能不是。 但这取决于系统的设置方式。 如果用户可以编辑他们的电子邮件地址和/或电子邮件地址不是唯一的,他们可以通过暂时更改他们的电子邮件地址或者只是以新用户的身份注册来获得对其他用户的“项目”的编辑访问权限。已知用户的电子邮件地址。

即使您从未在应用程序中显示用户的电子邮件地址,当您将大部分身份validation过程留在用户提供的字段中时,也存在固有的漏洞。

根据您提供的信息,不确切知道如何在Devise中设置内容 – 我会尝试以下方法:

这两个可能是触摸较慢,具体取决于调用时ActiveRecord的状态

  • <% if item.user == current_user %>
  • <% if item.user.id == current_user.id %>

这个应该是一个更快的触摸,因为你没有从item对象获取user对象(你只是直接从user对象的user_id方法拉)

  • <% if item.user_id == current_user.id %>

无论我在速度上的猜测是对还是错,这通常都是比你所说的更好的解决方案。 由于用户的ID永远不会被他们直接控制 – 除非您的代码中存在重大漏洞 – 他们不能像其他用户那样容易构成。

我最终这样做了:

 <% if item.email == current_user.email %> 

它有用……是吗?