2017-01-25 7 views
1

私はRailsアプリケーションでCanCan gemを使用していますが、現在のリクエストが私のアプリケーションの保護されたリソースであるかどうかを確認します。現在のリクエストがCanCanでRailsで保護されているかどうか確認してください

だから例えば私は、次があります。

class AdminController < ApplicationController 

    load_and_authorize_resource 

end 

要求がカンカンで保護されている場合、私は確認することができますどのように?

私はコントローラーとアクションをparamsでアクセスできます。標準can?cannot?ヘルパーを使用することはできません。なぜなら、アクション自体に保護があるのではなく、current_userにアクセス許可があるかどうかを確認するからです。例えばので

class ApplicationController < ActionController::Base 

    before_action :check_protected 

    def check_protected 
    if can? params[:action].to_sym, Object.const_get(params[:controller].classify) 
     # resource is protected 
    else 
     # resource is not protected 
    end 
    end 

end 

^^ユーザーが権限を持っていない場合、それは常にとき何current_userfalseを言わないかだろうので、これは動作しません。 リソース自体がCanCanで保護されているかどうかを確認する必要があります。私はこれらの例があった場合

は:

class PostsController < AdminController 

    def index 
    end 

end 

class HomeController < ApplicationController 

    def index 
    end 

end 

をPostsControllerのための指標は、保護されたことを特定でき、かつ保護されていないようにHomeControllerのインデックス必要があります。

+0

カンカンは、ユーザー認証の逸品です

def check_protected if CanCan::ControllerResource.new(self).skip?(:authorize) # resource is not protected else # resource is protected end end 

、目的は、ユーザが持っているかどうかを確認することです許可されたリソースへのアクセス。これには能力クラスとcurrent_userメソッドが必要です。 [このページの](https://github.com/ryanb/cancan/wiki/changing-defaults)で説明されているように、デフォルトを上書きすることができます。 – trueinViso

+0

@trueinViso私は 'Ability'クラスと' current_user'メソッドの両方を持っています。しかし、現在のコントローラメソッドにcancan属性が付いているかどうかを知りたい。 – Cameron

+0

コントローラメソッドには、cancan属性がアタッチされていません。能力はcurrent_userで定義されます。 skip_authorize_resourceと言うと、current_userがリソースへのアクセス権を持っているかどうかはチェックされません。 – trueinViso

答えて

1

CanCanは、CanCan::ControllerResource#skip?メソッドを使用して、リソースを許可するかどうかを判断します。だから私は、次のようにあなたがそれに頼ることができると思います。私は私のサンドボックスでそれを試してみた、それは私のために働いた

+0

エラーを「初期化されていない定数CanCan :: ControllerResouce」にすることで、常にリソースが保護されていると考えます。 – Cameron

+0

使用するCanCanのバージョンによっては構文が曖昧になる可能性があります。 –

+0

エラーについて不平はなくなりましたが、保護されているすべてのリソースについてもfalseを返します。たとえば、 'self'は'# 'を返し、DashboardはAdminControllerから継承します。このAdminControllerには' load_and_authorize_resource'があります。 – Cameron

関連する問題