Ruby on rails Rails应用程序中的物品/微型物品的积垢所有权

Ruby on rails Rails应用程序中的物品/微型物品的积垢所有权,ruby-on-rails,ruby,erb,Ruby On Rails,Ruby,Erb,我有一个简单的rails应用程序,用户可以在其中创建“项目”,但在列出所有项目的主索引页上,每个“项目”旁边都有“显示、编辑和删除”链接。我知道这是因为我使用脚手架来完成项目,但我想确保人们只能编辑他们创建的项目。这个逻辑目前有点超出我的理解力,正如我之前所说的,我对rails是完全陌生的 用户控制器: class UsersController < ApplicationController def show @user = User.find_by_username(par

我有一个简单的rails应用程序,用户可以在其中创建“项目”,但在列出所有项目的主索引页上,每个“项目”旁边都有“显示、编辑和删除”链接。我知道这是因为我使用脚手架来完成项目,但我想确保人们只能编辑他们创建的项目。这个逻辑目前有点超出我的理解力,正如我之前所说的,我对rails是完全陌生的

用户控制器:

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

<div class="well">
  <h1>All Items</h1>
    <table>
  <tr>
    <th>Title</th>
    <th>Details</th>
    <th>Inquire</th>
    <th></th>
    <th></th>
    <th></th>
  </tr>
<% @items.each do |item| %>
  <tr>
    <td><%= link_to item.title, item_path(item) %></td>
    <td><%= item.content %></td>
    <td><%= mail_to item.email, "Inquire", :cc => "michaelomchenry@gmail.com",
                 :subject => "OverFlow Inquiry Regarding " + item.title %></td>
    <td><%= link_to 'Show', item %></td>
    <td><%= link_to 'Edit', edit_item_path(item) %></td>
    <td><%= link_to 'Destroy', item, confirm: 'Are you sure?', method: :delete %></td>
  </tr>
<% end %>
  </table>

<br />
<%= link_to 'New Item', new_item_path %>
</div>

所有项目
标题
细节
询问
"michaelomchenry@gmail.com",
:subject=>“溢出查询关于”+item.title%>

项目模型:

class Item < ActiveRecord::Base
  attr_accessible :content, :user_id, :title
  validates :content, :length => { :maximum => 140 }
  belongs_to :user
  delegate :email, to: :user
end
class项{:最大值=>140}
属于:用户
代表:电子邮件,收件人::用户
结束

那里有很多东西。首先,为了能够根据用户筛选项目(或操作),您需要知道当时谁登录了,从而允许用户登录。例如,可以使用Rails的授权gem来实现这一点。Desive被大量使用,并且有很好的文档记录

设置Deviate后,您可以检查用户是否已登录(例如使用),Deviate将创建一个“current_user”变量供您使用(如中所示)。然后,您可以使用它过滤项目列表,例如:

editable_items = current_user.items
然后使用视图上的可编辑项。我建议您去阅读Desive教程,因为您所做的是一项非常常见且有详细文档记录的任务。

我最后做了以下工作:

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


它成功了。。。可以吗?

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

@momcher写道:

我最终做了这样的事:

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

它成功了。。。可以吗

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

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

仅根据您提供的信息,我不知道Desive中是如何设置的,我会尝试以下方法:

根据调用ActiveRecord时的状态,这两个可能会慢一些

这个应该更快,因为您不是从
对象中获取
用户
对象(您只是直接从
用户
对象的
用户id
方法中获取)


无论我对速度的猜测是对是错,这通常是一个比你所说的更适合你的解决方案。由于用户的ID永远不在他们的直接控制之下,除非您的代码中有重大漏洞,否则他们不能轻易地冒充其他用户。

类似于这个问题:谢谢,Martin。我会查一查的。很高兴能帮上忙。如果这回答了你的需要,请投票并接受它作为答案。如果没有,请发表评论,这样我就可以编辑它。因为我没有声誉,所以不能投票,但我已经接受了它作为我的答案。