2012-01-15 12 views
1

ユーザーが作成しなかったプロジェクトへのアクセスを制限しようとしています。Rails 3.2 CanCan - プロジェクトURLへのアクセスを制限しています

if user.has_role?(:Student) 
    can :create, Project 
    can :manage, Project, :user_id => user.id 
end 

:これは、と正常に動作しているようだ(サイド質問:それを書くためのより良い方法はあります^^?)

をしかし、私はまだURLにアクセスすることができます:/ユーザー/ 5 /プロジェクト

期待どおりのプロジェクトが表示されません。むしろページにアクセスできず、リダイレクトすることができます。

rescue_from CanCan::AccessDenied do |exception| 
    redirect_to root_url, :alert => exception.message 
end 

しかし、リダイレクトやエラーメッセージは表示されません。その仕事をするために何か他のものを能力に加える必要がありますか?

ProjectsControllerとUsersControllerの両方にload_and_authorize_resourceがあります。

レコードの

、私のルートは次のようになります。

resources :users do 
    resources :projects 
end 

答えて

1

はこの1

if user.has_role?(:Student) 
    can :create, Project 
    can :manage, Project do |P| 
    user && P.user == user 
end 

を試してみてくださいそれは、現在のユーザーは、プロジェクトを所有しているかどうかをチェックします。彼がプロジェクトを所有していなければ、彼はそれを変更することはできません。

userオブジェクトが存在するかどうかを確認するだけの状態ですが、そこに例外ハンドラを使用することもできます。ここではその一例です:

comment.try(:user) == user 
0

ユーザーが、現在のコレクション内の任意のプロジェクトを読み込むindexアクションを無効にし、余分な執行を追加することができない場合はリダイレクト動作を有効にする場合:

def index 
    # @projects is loaded by the CanCan before filter load_and_authorize_resource 
    unless @projects.any?{|project| can?(:read, project)} 
    raise CanCanAccessDenied.new("no project readable there", :read, Project) 
    end 
end 

インデックスのような(収集)コントローラのアクション、CanCanはauthorize :read, ModelClassによってACLを強制します。
https://github.com/ryanb/cancan/wiki/Checking-Abilities「クラスによる確認」を参照してください。
読めるように、ユーザーが:(これらのインスタンスがまだ存在しない場合でも)ModelClassインスタンスのいずれかを読み取る可能性がある場合は、クエリauthorize :action, ModelClassが承認されます。

あなたのURLが/users/5/projectsであり、ルートがresources :users do resources :projects endであるとします。このアクションは、特定のユーザーのプロジェクトのインデックスです。したがって、CanCanのインデックスアクションは、can :manage, Project, :user_id => user.idと与えられているので、ユーザーができるプロジェクトが存在することができます。後で、私はそれぞれの特定のプロジェクトインスタンスcan? :read, projectを承認し、そこにはフィルタリングされた場所があるので、そのページは空のままです。

関連する問題