2012-01-24 9 views
4

私のRailsアプリケーションは、いくつかのWebサービスのかなりのフロントエンドです。私は自分のユーザーモデルを維持しています。私はWebアプリケーションに認証のためにDeviseを使用して権限を追加する必要があります。私はCanCanとacl9が主にActiveRecordモデルのインスタンスで動作するように見えることに気付きました。 CanCanまたはacl9は依然として私のニーズに合っていますか?私の状況でこれらのライブラリのいずれかを使用するためのヒント?WebサービスでのRails認可

インスタンスではなくアクションで動作するものを探すべきでしょうか?

また、これらはロールベースのシステムであり、権限ベースのシステムを使用することを考えています。彼らはまだまだ良いフィット感でしょうか?

答えて

1

私はacl9について話すことはできません。しかし、cancan wikiは、「提供されていなければ、あなた自身の[モデル]アダプタを作るのは簡単です」と主張しています。 https://github.com/ryanb/cancan/wiki/Model-Adapterつまり、ActiveRecordを使用していなくても、cancanを使用できる可能性があります。

あなたが役割を持つことを計画していない場合はその後、再び、カンカンであなたの能力の定義が見て少し冗長かもしれません、例えば:

class Ability 
    include CanCan::Ability 

    def initialize(user) 
    user ||= User.new # guest user (not logged in) 

    can :create, Widget if user.has_permission(:create_widgets) 
    can :delete, Widget if user.has_permission(:delete_widgets) 
    can :herp, Derp if user.has_permission(:herp_derp) 
    end 
end 

あなただけのためにカンカンを使用することができればそれは素晴らしいことですそのコントローラーのアクション承認方法は、私はそれが可能かどうかは分かりません。がんばろう。

0

ちょうど(最終的に)acl9と答えてください。

Acl9は2つの非常に別個の部分で構成されています。コントローラ内に置いたすべての許可項目であるAccess Control Subsystemと、認証されたユーザからの役割の設定/確認/削除を行うRole Subsystemです。

アクセス制御サブシステムこれまで呼び出しがcurrent_user.has_role?(role, obj=nil)であることを唯一のもの。したがって、ロールサブシステムはActiveRecord、アソシエーション、データベースなどには全く依存しません。です。ActiveRecord依存のhas_role?メソッドをクラスに追加するヘル​​パー(acts_as_authorization_subject)ですが、これは完全にオプションです。独自のhas_role?メソッド(これはまた、acl9を取得するためにsuperを呼び出すことにフォールバックすることもできます)を使用してアクセスチェックを実装してください。だから、doはあなたのユーザーモデルを維持しますが、ユーザーの役割は学校の管理者にしたいとしますが、その学校は一部のリモートシステムへのWebサービス呼び出しです。

## in your model 
class User < ActiveRecord::Base 

    def has_role? role, obj=nil 
    role == :admin && 
     obj == school && 
     school[:admin] == id # <-- just making up how we know we're the admin of the remote school 
    end 
    end 

    def school 
    @school ||= School.get_by_user_id(id) 
    end 
end 

## in your controller 
class SomeController < ApplicationController 
    before_action :set_school 

    access_control do 
    allow :admin, of: :school 
    end 

    private 
    def set_school 
    @school = School.get_by_id(params[:school_id]) 
    end 
end 
関連する問題