0

私は Rails アプリ、CanCan を使用した承認に取り組んでいます。アプリには db モデル User と PositionGameStat があります。PositionGameStat には user_id の外部キーがあります。position_game_stat のインデックス ページには、ユーザーが送信した統計のリストが表示され、それぞれに編集ボタンがあります。現在、インジェクションに対して脆弱です (... /position_game_stats/130/edit)

ユーザーが現在のユーザーと等しい position_game_stat エントリのみを編集できるようにしたいと思います。

つまり、誰かが .../position_game_stats/129/edit という URL に挿入しようとして、それらの統計を入力しなかった場合、CanCan によってアクセスが拒否されます。

以下は私のコードです。

マイコード: app/controllers/position_game_stats_controller.rb

class PositionGameStatsController < ApplicationController  

    before_filter :authenticate_user! 
    ...   
    def edit
      authorize! :manage, @position_game_stat 
      @position_game_stat = PositionGameStat.find(params[:id])
    end 
    ... 
  end

アプリ/モデル/能力.rb

class Ability
  include CanCan::Ability

  def initialize(user)
    can :show, User, :id => user.id
    can :manage, PositionGameStat do |t|
      t.user_id == user.id
    end  
  end 
end

どんな提案でも大歓迎です。

更新: ビリー・チャンの提案によると、このコードに少なくともいくらか近いようです: 能力

class Ability
  include CanCan::Ability

  def initialize(user)
    can :show, User, :id => user.id
    can :manage, PositionGameStat do |t|
      t.user == current_user
    end
  end
end

コントローラ

class PositionGameStatsController < ApplicationController

  before_filter :authenticate_user!

...

  def edit
    authorize! :manage, PositionGameStat
    @position_game_stat = PositionGameStat.find(params[:id])
  end
...
end

これは、ページへのアクセスを拒否していないという意味で私を近づけましたが、それでもインジェクションに対して脆弱です. たとえば、/position_game_stats/137/edit は、別のユーザーによって作成された場合でも引き続きアクセスできます。

助言がありますか?

4

3 に答える 3

0

最終的な解決策: PositionGameStatsController.rb

    class PositionGameStatsController < ApplicationController

      before_filter :authenticate_user!

      load_and_authorize_resource

...

      def edit
        authorize! :manage, PositionGameStat
        @position_game_stat = PositionGameStat.find(params[:id])
      end
...
    end

アビリティ.rb

class Ability
  include CanCan::Ability

  def initialize(user)
    can :show, User, :id => user.id
    can :manage, PositionGameStat do |t|
      t.user.id == user.id
    end
  end
end

提案をしてくれた Billy Chan と Steakchaser の両方に感謝します。current_user は、何らかの理由で Ability.rb では機能しません。

于 2013-08-28T06:56:42.037 に答える