如何限制对编辑操作的访问权限以及通过URL输入?

时间:2013-11-01 14:21:43

标签: ruby-on-rails ruby ruby-on-rails-3 devise

我有一个关系用户(“设计”),它有很多事件。

我想阻止用户编辑不属于他们的事件,并通过在浏览器中输入'http://localhost:3000/events/65/edit'等内容来阻止用户访问编辑操作。

我还希望在点击编辑事件链接时将用户重定向回他们所在的页面。

我尝试了以下两种方法但没有成功:

def edit
  if current_user == @event.user_id
    @event = Event.find(params[:id])
  else
    redirect_to events_path
  end

  def edit
    @event = Event.find(params[:id])
    unless session[:id] == @event.user_id
      redirect_to events_path
      return
    end
  end

3 个答案:

答案 0 :(得分:3)

如果你只需要在这个控制器中使用这种授权逻辑,那么就可以这样:

class User < ActiveRecord::Base
  has_many :events
end

class EventsController < ApplicationController
  def edit
    @event = current_user.events.find(params[:id])
  rescue ActiveRecord::RecordNotFound
    redirect_to events_path, notice: "You cannot edit this event."
  end
end

救援区实际上是可选的。如果您将其删除,则用户在访问未创建的活动的编辑网址时会收到404 Not found错误消息,

如果您希望在申请中使用其他地方的授权,我建议您查看CanCan。这是一个gem,它在Ability类中对授权和访问的规则进行了分类。

答案 1 :(得分:2)

尝试添加before过滤器(如果需要,也可以用于其他操作):

 before_filter :check_user, :only => [:edit]

 def check_user
    @event = Event.find(params[:id])
    unless current_user.id == @event.user_id
       redirect_to (request.referrer || root_path)
       return
    end
 end

答案 2 :(得分:2)

你的第一种方法背后的想法很好,但这种比较总是会失败。 current_user是一个User对象; @event.user_id是一个整数(或者可能是某种形式的UUID)。

您需要将User对象与User对象进行比较:

if current_user == @event.user

或ID的ID:

if current_user.id == @event.user_id