Ruby on rails Rails:如何防止未经授权访问控制器更新操作

Ruby on rails Rails:如何防止未经授权访问控制器更新操作,ruby-on-rails,ruby,ruby-on-rails-3,model-view-controller,Ruby On Rails,Ruby,Ruby On Rails 3,Model View Controller,您好,我是rails的新手,我正在尝试找出如何防止未经授权访问控制器的更新操作 我知道我可以有一个前文件管理器,它可以将未登录的用户踢出,我可以在edit操作中将重定向到,但我希望有一种方法可以阻止用户编辑不属于他们的对象 例如:授权用户只需在我的应用程序中更改作业对象,即可直接发送带有任何作业.id的请求作为参数,并更改他们想要的任何字段 这是我的控制器: def update @job = Job.find(params[:id]) @job.update_attri

您好,我是rails的新手,我正在尝试找出如何防止未经授权访问控制器的更新操作

我知道我可以有一个前文件管理器,它可以将未登录的用户踢出,我可以在
edit
操作中将
重定向到
,但我希望有一种方法可以阻止用户编辑不属于他们的对象

例如:授权用户只需在我的应用程序中更改
作业
对象,即可直接发送带有任何
作业.id
请求作为参数,并更改他们想要的任何字段

这是我的控制器:

  def update
    @job = Job.find(params[:id])


    @job.update_attributes(params[:job])
    redirect_to jobs_path
  end
为了尝试解决这个问题,我尝试检查
update
操作,如果用户得到授权,如果他们没有,我会将他们重定向到索引页

  def update
    @job = Job.find(params[:id])

    if @job.user.id != current_login
      redirect_to jobs_path
    end

    @job.update_attributes(params[:job])
    redirect_to jobs_path
  end
但当我尝试这样做时,rails给了我一个错误,告诉我在一个操作中只能有一个重定向

def update
    @job = Job.find(params[:id])

    @job.update_attributes(params[:job]) unless @job.user.id != current_login

    redirect_to jobs_path
end
:)


:)

您可以执行
重定向到作业路径并返回
返回重定向到作业路径

请尝试以下操作:

def update
    @job = Job.find(params[:id])

    if @job.user.id != current_login
      redirect_to jobs_path and return
    end

    @job.update_attributes(params[:job])
    redirect_to jobs_path and return
  end

您可以执行
重定向到作业路径并返回
返回重定向到作业路径

请尝试以下操作:

def update
    @job = Job.find(params[:id])

    if @job.user.id != current_login
      redirect_to jobs_path and return
    end

    @job.update_attributes(params[:job])
    redirect_to jobs_path and return
  end

这可能是因为在第一次重定向之后,第二次重定向仍然可以执行。 因此,将
update\u属性
和第二个
重定向
放入else路径(如下所示)应该可以解决问题:

    def update
      @job = Job.find(params[:id])

      if @job.user.id != current_login
        redirect_to jobs_path
      else
        @job.update_attributes(params[:job])
        redirect_to jobs_path
      end
    end

这可能是因为在第一次重定向之后,第二次重定向仍然可以执行。 因此,将
update\u属性
和第二个
重定向
放入else路径(如下所示)应该可以解决问题:

    def update
      @job = Job.find(params[:id])

      if @job.user.id != current_login
        redirect_to jobs_path
      else
        @job.update_attributes(params[:job])
        redirect_to jobs_path
      end
    end
使用Else子句 问题在于,该方法并没有结束当前的方法;它只是告诉控制器设置一些标题。为了防止这个问题,您需要确保控件不会“掉到”第二个重定向。一种方法是将您的替代路径放入else子句中。例如:

def update
  @job = Job.find(params[:id])

  if @job.user.id != current_login
    redirect_to jobs_path
  else
    @job.update_attributes(params[:job])
    redirect_to jobs_path
  end
end
使用Else子句 问题在于,该方法并没有结束当前的方法;它只是告诉控制器设置一些标题。为了防止这个问题,您需要确保控件不会“掉到”第二个重定向。一种方法是将您的替代路径放入else子句中。例如:

def update
  @job = Job.find(params[:id])

  if @job.user.id != current_login
    redirect_to jobs_path
  else
    @job.update_attributes(params[:job])
    redirect_to jobs_path
  end
end

好的,解决您眼前问题的简单方法是使用流控制,以确保在单个请求上只到达一个
重定向到
,正如许多其他人所建议的那样

然而,这并不是我解决你更大问题的方法

首先,有很多用于管理授权的现有解决方案,例如或。我会调查的

其次,正如您所建议的,我会使用
before_filter
来阻止访问。比如:

before_filter :load_job, :only => [:show, :edit, :update, :delete]
before_filter :require_authorization, :only => [:edit, :update, :delete]

def load_job
  @job = Job.find(params[:id])
end

def require_authorization
  redirect_to jobs_path unless current_user.can_edit?(@job) # or whatever you want to check
end

before过滤器将按顺序执行,因此在您检查权限时,用户和作业已经可用,并且可以检查该特定作业的权限。

好的,解决当前问题的简单方法是使用流控制,以确保在单个请求中只到达一个
重定向到
,正如许多其他人所建议的那样

然而,这并不是我解决你更大问题的方法

首先,有很多用于管理授权的现有解决方案,例如或。我会调查的

其次,正如您所建议的,我会使用
before_filter
来阻止访问。比如:

before_filter :load_job, :only => [:show, :edit, :update, :delete]
before_filter :require_authorization, :only => [:edit, :update, :delete]

def load_job
  @job = Job.find(params[:id])
end

def require_authorization
  redirect_to jobs_path unless current_user.can_edit?(@job) # or whatever you want to check
end
before过滤器将按顺序执行,因此当您检查权限时,用户和作业已经可用,并且可以检查该特定作业的权限