私は 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 は、別のユーザーによって作成された場合でも引き続きアクセスできます。
助言がありますか?