【问题标题】:Rails4: Restrict Controller Destroy ActionRails4:限制控制器销毁操作
【发布时间】:2013-08-18 22:04:23
【问题描述】:

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

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

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

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

但他的做法不是很糟糕,因为有人可以轻松破解它吗?

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

【问题讨论】:

  • 每个UserShop 或可以有_many Shops
  • 这完全是另一个问题。我尝试设置它,所以用户将被限制为 1,但没有让它工作。通常用户应该只有一个商店。

标签: ruby-on-rails controller ruby-on-rails-4


【解决方案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

这是一个超级有用的宝石,并且有很好的记录

【讨论】:

    【解决方案2】:

    另一种方法:

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

    routes.rb:

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

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

    def set_shop
      @shop = current_user.shop
    end
    

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

    【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 我的控制器中已经有一个 before_action。 -> before_action :set_shop, only: [:show, :edit, :update, :destroy].. 你能编辑你的答案吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多