2016-10-30 4 views
0

私はAJAX経由で更新しようとしているProfileモデルを持っています。403 AJAXでリラックスしたコントローラ内の非居眠り行動を呼び出すときに禁止

これは私のroutes.rbです:

次のルートを生成
resources :profiles do 
    member do 
     patch :speed_rating 
     patch :dribbling_rating 
     patch :passing_rating 
     patch :tackling_rating 
    end 
    end 

speed_rating_profile_path PATCH /profiles/:id/speed_rating(.:format)  
profiles#speed_rating 

dribbling_rating_profile_path PATCH /profiles/:id/dribbling_rating(.:format)  
profiles#dribbling_rating 

passing_rating_profile_path PATCH /profiles/:id/passing_rating(.:format) 
profiles#passing_rating 

tackling_rating_profile_path PATCH /profiles/:id/tackling_rating(.:format) 
profiles#tackling_rating 

これは私のProfilesControllerです:

profile.js
class ProfilesController < ApplicationController 
    before_action :set_profile, only: [:show, :edit, :update, :destroy, :invite_user, :speed_rating, :tackling_rating, :dribbling_rating, :passing_rating] 
    authorize_resource except: [:dashboard] 
    skip_authorization_check only: :dashboard 

    def speed_rating 
    binding.pry 
    end 

    def dribbling_rating 
    binding.pry 
    end 

    def passing_rating 
    binding.pry 
    end 

    def tackling_rating 
    binding.pry 
    end 

    private 
    def set_profile 
     @profile = Profile.friendly.find(params[:id]) 
    end 

    def profile_params 
     params.require(:profile).permit(:id, :first_name, :last_name, :dob, :height, :weight, :bib_color, videos_attributes: [:id, :url, :video, :vimeo_url, :vimeo_embed_code, :official, :video_cache, :remove_video, :_destroy], transcripts_attributes: [:id, :url, :name, :transcript, :remove_transcript, :url_cache, :_destroy]) 
    end 

、私はこれをやっています:

var url = "/profiles/" + _profile_id + "/" + _rating_type + "_rating/?" + _rating_type + "=" + button.innerText 

    $.ajax({ 
    type: "PATCH", 
    url: url, 
    success: function(result){ 
     console.log(_profile_id + "'s " + _rating_type + " was successfully updated."); 
     console.log(result); 
    }, 
    error: function(result){ 
     console.log(_profile_id + "'s " + _rating_type + " was successfully updated."); 
     console.log(result); 
    } 
    }) 

これは私が取得していますエラーです:

jquery.self-bd7ddd3….js?body=1:10255 PATCH http://localhost:3000/profiles/rebecca-nitzsche-st-george-s-college/dribbling_rating/?dribbling=6 403 (Forbidden) 

編集1

を私は承認のためCanCanCanを使用しています。私が試した

ことの一つは、私は特にこのように、承認のための例外のリストにそれらの新しいアクションを追加します:

authorize_resource except: [:dashboard, :speed_rating, :dribbling_rating, :tackling_rating, :passing_rating] 

これまで動作しているようだという。しかし、これは私のアプリを安全にしないのですか?

これらのルートを発見した場合、ユーザーがこれらのルートを悪用することがないようにするには、どうすればよいのですか?

答えて

0

私は、この行と仮定するつもりです:

authorize_resource except: [:dashboard] 

は、おそらくユーザーの詳細情報を必要とする認証または認可のいくつかのフォームを、やっています。あなたのAJAXリクエストでは、ユーザー名やパスワード、セッションクッキーに関する規定は見当たりません。リクエストが正常に承認されるように、AJAXリクエストでセッションCookieを送信していることを確認する必要があります。

あなたは$.ajaxへの呼び出しにxhrFieldsオブジェクトを含むことによってこれを行うことができるかもしれません:

$.ajax({ 
    'type': 'PATCH', 
    'url': 'whatever', 
    'xhrFields': { 
     'withCredentials': true 
    } 
    // whatever other AJAX options you need 
}); 
+0

私は思考のあなたのラインが好き、それは動作しません:( – marcamillion

+0

あなたが右の原因としましたそれはあなたが少し間違っていた処方箋だけです。私は、私が試したものとうまくいったもので質問を更新しました。しかし、それはセキュリティの観点から、最良のアプローチではないように感じます。 CanCanCanによって管理される認可ルール? – marcamillion

関連する問題