0

こんにちは私はレールに慣れていないので、コントローラーの更新アクションへの不正アクセスを防ぐ方法を見つけようとしています。

ログインしていない人を追い出す before_filer を使用できることはわかっていますがredirect_toeditユーザーが自分に属していないオブジェクトを編集できないようにする方法が必要です。

例: 許可されたユーザーは、パラメーターとしてany を指定してリクエストをjob直接送信し、必要なフィールドを変更することで、アプリ内のオブジェクトを簡単に変更できます。PUTjob.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

しかし、これを行おうとすると、1 つのアクションでリダイレクトを 1 つしか持てないというエラーが Rails から返されます。

4

5 に答える 5

2

redirect_toさて、差し迫った問題に対する直接的な解決策は、他の多くの人が示唆しているように、フロー制御を使用して、1 つの要求で 1 つのみに到達するようにすることです。

しかし、それはあなたのより大きな問題を解決する方法ではありません。

まず、 cancanrolifyなど、承認を管理するための既存のソリューションが多数あります。私はそれらを調べます。

次に、before_filterあなたが示唆するように、アクセスをブロックするために a を使用します。何かのようなもの:

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

前のフィルターは順番に実行されるため、アクセス許可を確認するときにユーザーとジョブが既に利用可能であり、その特定のジョブのアクセス許可を確認できます。

于 2013-07-29T22:26:46.263 に答える
1
def update
    @job = Job.find(params[:id])

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

    redirect_to jobs_path
end

:)

于 2013-07-29T22:22:48.993 に答える
1

これはおそらく、最初のリダイレクトの後、2 番目のリダイレクトがまだ実行されている可能性があるためです。したがって、次のようにupdate_attributesと 2 番目redirectを 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
于 2013-07-29T22:26:16.310 に答える
0

redirect_to jobs_path and returnまたはのいずれかを実行できますreturn redirect_to jobs_path

次のことを試してください。

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
于 2013-07-29T22:23:37.220 に答える
0

Else 句を使用する

問題は、redirect_toメソッドが現在のメソッドを終了しないことです。コントローラーにいくつかのヘッダーを設定するように指示するだけです。この問題を回避するには、制御が 2 番目のリダイレクトに「フォールスルー」しないようにする必要があります。これを行う 1 つの方法は、代替パスを 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
于 2013-07-29T22:26:25.077 に答える