Rails4:限制控制器销毁操作

时间:2013-08-18 22:04:23

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

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

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

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

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

但是他不是一个糟糕的做法,因为有人可以轻易入侵这个?

如果有人能在这方面给我启发...... 谢谢:)

3 个答案:

答案 0 :(得分: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

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

答案 1 :(得分:1)

另一种方法:

您可以使用单一资源(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获取要销毁/编辑的商店,因此他无法使用假身份证制作自定义请求。

答案 2 :(得分:0)

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

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