0

我在控制器中设置了我的 current_user,因此用户无法编辑其他用户的条目。

但我可以让它为 Destroy Action 工作。

我唯一的解决方案是检查用户是否是实际上传者,然后才向他显示销毁链接。

 <% if current_user == shop.user %>
    <td><%= link_to 'Destroy', shop, method: :delete, data: { confirm: 'Are you sure?' } %></td>
<% end %>

但是他不是一个坏习惯,因为有人可以轻松破解这个吗?

如果有人可以启发我...谢谢:)

4

3 回答 3

1

另一种方法:

您可以使用单数资源 ( http://guides.rubyonrails.org/routing.html#singular-resources ) 而不是复数,而不是传递商店 ID 来编辑、更新和销毁。

路线.rb:

resources :shops, only: :show, :index
resource :shop, only: [:new, :create, edit, :update, :destroy]

您还需要更改before_action它以获取当前用户的商店,而不是通过id传递的 as 参数进行查询:

def set_shop
  @shop = current_user.shop
end

因为您不再使用id网络用户提供的获取要销毁/编辑的商店,所以他无法使用假 ID 发出自定义请求。

于 2013-08-18T22:59:52.277 回答
1

您可以使用CanCan gem。安装后,CanCan 将生成一个“能力”文件,您可以在其中定义用户可以做什么或不可以做什么。例如,在你的情况下,你可能有

def initialize(user)
    user ||= User.new # guest user (not logged in)
    if user.admin?
      can :manage, :all
    else
      can :read, :all
    end
  end

然后在你的视图中,你可以做一个简单的检查,看看用户是否有能力修改那个对象。例如:

<% if can? :destroy, shop %>
  <td><%= link_to 'Destroy', shop, method: :delete, data: { confirm: 'Are you sure?' } %></td>
<% end %>

在您的控制器中,您可以授权如下操作:

class ShopsController < ActionController::Base
  load_and_authorize_resource
  def destroy
    ....
  end
end

“load_and_authorize_resource”行会自动将授权添加到每个 RESTful 操作中。它会将其添加到您的销毁操作中,例如:

        @shop = Shop.find(params[:id])
        authorize! :destroy, @shop

这是一个超级有用的宝石,并且有据可查

于 2013-08-18T22:52:53.817 回答
0

您应该将它隐藏在视图中,但您也应该在控制器上控制它。

在您的控制器中,您必须执行类似before_action的操作(在此处阅读:http: //guides.rubyonrails.org/action_controller_overview.html

于 2013-08-18T22:11:09.910 回答