2

Devise/CanCanで保護されているコントローラーが:authenticate_user!ありload_and_authorize_resourceます。アクションへのjavascript接続にはまたはその役割が含まれていないため、javascriptでアクションを機能:except => [:sort]させるには、これらに追加する必要があります。sortsortcurrent_user

gonを使用しての役割を渡すことで問題を回避しましたcurrent_user(そして、がない場合はcurrent_user、「匿名」を渡します)。これがJavaScript側で安全かどうかはわかりません(おそらく、変数はブラウザーのコンソールで設定/オーバーライドできます)。また、sort直接POST用に開いたままにしているため、アクションは安全ではないと確信しています。アクセス-アクションの正しいパラメーターを送信してRESTedでこれをテストした結果、データが再ソートされました。

だから:JavaScriptからDevise / CanCanによって保護されているRailsコントローラーへの安全なアクセスを有効にするにはどうすればよいですか?

これが私のRailsアプリの詳細です...

これは(切り捨てられた)コントローラーであり、sortDevise / CanCanからアクションを免除する方法を表示し、可能な場合gon.current_user_roleは変数をの役割に設定します。current_user

class ThingsController < ApplicationController
  before_filter :authenticate_user!, :except => [:sort]
  load_and_authorize_resource :except => [:sort]

  def show
    @thing = Thing.find(params[:id])

    if current_user
      gon.current_user_role = current_user.role
    else
      gon.current_user_role = "anonymous"
    end

    respond_to do |format|
      format.html
    end
  end

  def sort
    params[:thing].each_with_index do |id, index|
      Thing.update_all({position: index+1}, {id: id})
    end
    render nothing: true
  end

end

私の見解では、「admin」ロールを持つユーザーのみがソート可能である必要があるアイテムの順序付けられていないリストがあります。

<ul class="things" data-update-url="<%= sort_things_url %>">
  <% @things.each do |t| %>
    <%= content_tag_for(:li, t) do %>
      <%= image_tag t.image %>
    <% end %>
  <% end %>
</ul>

これがapplication.jsファイルのjavascriptです。ここでは、gon.current_user_role変数が「admin」の場合にのみリストをソート可能にしています。

$(function() {
  if (gon.current_user_role == "admin")
  {
    $( ".things" ).sortable({
      update: function() {
        return $.post($(this).data('update-url'), $(this).sortable('serialize'));
      }
    });
    $( ".things" ).disableSelection();
  }
});

sort最後に、routes.rbファイルはPOST呼び出しに対するアクションを開きます。

  resources :things do
    collection { post :sort }
  end
4

1 に答える 1

0

current_userソートアクションへのJavaScript接続またはその役割が含まれていないことについて誤解しました。私が間違っていた理由は、Powを使用しているため、 http://railsapp.devでRailsアプリにアクセスしていたためです...しかし、JavaScriptリクエストは127.0.0.1からのものとしてマークされています... 'XSSリクエストとして扱われます。

を使用して標準のRailsサーバーを起動したrails sとき、またはステージングサーバーでこれらの試行を行ったとき、JavaScriptはを認識していましたcurrent_user

私のコントローラーは次のようになりました:

class ThingsController < ApplicationController
  before_filter :authenticate_user!
  load_and_authorize_resource

  def show
    @thing = Thing.find(params[:id])

    if current_user
      gon.current_user_role = current_user.role
    else
      gon.current_user_role = "anonymous"
    end

    respond_to do |format|
      format.html
    end
  end

  def sort
    params[:thing].each_with_index do |id, index|
      Thing.update_all({position: index+1}, {id: id})
    end
    render nothing: true
  end

end

私のビューとJavaScriptは同じままでした。

この設定では、アクションへの任意のPOST呼び出しが禁止さsortれており、「admin」ロールを持たないユーザーがアイテムを再配置することもできません。誰かJavaScript変数を操作する方法を理解した場合gon.current_user_role、ページ上のアイテムを視覚的に再配置できますが、アクションによって要求が許可されないため、その再配置はデータベースに保存されませんsort(変更は次のページの読み込み)。

この設定ではPowの問題は解決しませんが、問題は解決しません。

于 2013-03-01T01:22:40.680 に答える