2012-01-28 5 views
0

アクセス制御パターンがfacebook graph apiと非常に似ているパブリックAPIを使用してサービスを実装しようとしています。私はDeviseでOAuthを行うことができ、またトークンにアクセスするための許可/スコープを簡単に与えることができるドアキーパーの宝石を使用しています。Railsのロールベースのアクセス制御(oauth-)を行う方法は?

だから、それを超えて、私は必要があります: - アクセストークン の範囲に基づいたアクセス制御 - (Facebookでのプライバシー設定など)のプラットフォーム上の異なるグループのユーザーのアクセス制御 - アクセス制御は、動的である必要があります私はCanCanをロールベースのアクセス制御をしているように見ましたが、OAuthを非常に簡単に不合理にしているように見えないので、ちょうどロールするのがベストかもしれないかどうか私に尋ねます。私自身のシステムを外していますか?基本的にモデルのすべてのアクセス制御を行うのが正しい方法でしょうか?

他に提案がありますか?

+0

CanCanではお客様のニーズに対応できません。私はOAuthに精通していませんが、うまくいかない理由は考えられません。 – Max

+0

私の研究で見た限りでは、CanCanは非常に伝統的なRBACを対象としています。私は潜在的にすべてのユーザーのためにダイナミックなスコープが必要なので、グループに入れることはできません(少なくとも私のcancanの理解になります) – nambrot

+0

"ダイナミックスコープ"が意味するものは少し不明です。 – Max

答えて

0

私はCanCanがあなたが望むものを処理できると思います。ユーザーが承認したと思われるものについて具体的な情報を提供していないので、私は役に立つと思ういくつかの方法を紹介します。私が言う最初のことは、あなたがあなたの能力ファイルに望むどんなオブジェクトでも渡すことができるということです。これを行うには、次のようにします。あなたが希望のアプリ/モデルで

def ApplicationController < ActionController::Base 
    def current_ability 
    @current_ability = CustomAbility.new(pass, in, anything, here) 
    end 
end 

をcustom_ability.rbを定義する場合:この場合

def CustomAbility 
    include CanCan::Ability 

    def initialize(anything, you, want, here) 
    ... 
    end 
end 

を、何も=合格、あなたは= =何をしたい、でここに=ここに。さらに、認可しているリソースでいくつかのメソッドを呼び出すことができます。 CanCanは@resource_nameを読み込み、承認する能力ファイルを入力することで動作します。 RESTfulなルートを仮定して@resource_nameをロードしますが、before_filterを使用して@ resource_nameに格納する(つまり、@userにユーザーを格納する)限り、自分のリソースを簡単にロードできます。

すでに作成されたパラメータを承認するオブジェクト上の特定のメソッドを呼び出すこともできます。たとえば、次のようなことがあります。

def initialize(user) 
    can :read, Post do |post| 
    !((post.readable_groups & user.groups).empty?) 
    end 
end 

基本的に、そのブロックの行がfalseを返した場合、あなたは無許可になります。唯一の注意点は、ブロックが作成時または新規作成時に実行されないことです。これを回避する方法があります。たとえば、一意性検証を使用してモデルレベルでユーザーあたり1つのポストを実施するとします。前のフィルタを使用して投稿を読み込んでuser_idを設定してから、

can :create, Post, valid?: true 

とにかく役立ちます。

+0

私は唯一の質問は次のようなものだと思います:初期化するために渡す引数に応じて、Postの特定の属性を表示するにはどうすればよいですか?私はadminsにすべてのデータを見ることができますが、ゲストは投稿の抜粋だけを見ています。 – nambrot

+0

通常、CanCanのアクションはコントローラのアクションに対応しますが、アクションを任意に定義することは可能です。たとえば、次のようなものを置くことができると思います。 '':read_part、 '' Post#Hashまたは条件のブロック ''を読んだ後、 '<%if can?(:read_part、@post)%> 'など – Max

関連する問題