Devise/CanCanで保護されているコントローラーが:authenticate_user!
ありload_and_authorize_resource
ます。アクションへのjavascript接続にはまたはその役割が含まれていないため、javascriptでアクションを機能:except => [:sort]
させるには、これらに追加する必要があります。sort
sort
current_user
gonを使用しての役割を渡すことで問題を回避しましたcurrent_user
(そして、がない場合はcurrent_user
、「匿名」を渡します)。これがJavaScript側で安全かどうかはわかりません(おそらく、変数はブラウザーのコンソールで設定/オーバーライドできます)。また、sort
直接POST用に開いたままにしているため、アクションは安全ではないと確信しています。アクセス-アクションの正しいパラメーターを送信してRESTedでこれをテストした結果、データが再ソートされました。
だから:JavaScriptからDevise / CanCanによって保護されているRailsコントローラーへの安全なアクセスを有効にするにはどうすればよいですか?
これが私のRailsアプリの詳細です...
これは(切り捨てられた)コントローラーであり、sort
Devise / 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