2011-07-09 13 views
1

私はそれらのモデルデータベースモデルや協会ソリューション

User, Developer, App, Permission 
  1. を持っているユーザーがデフォルトのPermision
  2. は、ユーザーが別のアプリケーションの許可
  3. を持つことができ、ユーザは複数のアプリケーション
  4. をインストールすることができますことができますユーザーはアプリケーションの開発者でもある可能性があります。
  5. 開発者は依然としてユーザーであり、すべてのユーザーの個人所有権これまで各アプリケーションのapplcation、既定のアクセス許可、アクセス権)

をインストールし、私は持っている:

user.rb

class User < ActiveRecord::Base 
    has_many :apps 
end 

app.rb

class App < ActiveRecord::Base 
    has_many :permissions, :through => :app_permissions 
end 

をpermission.rb
class Permission < ActiveRecord::Base 
    belongs_to :app 
end 

app_permission.rb

class AppPermission < ActiveRecord::Base 
end 

ユーザーを区別するために、どのような質問

  1. ? (通常、開発者)CanCanまたはRails STIまたはSimple Roles Classを使用する方が良いですか?これら3つのソリューションのいずれかを使用する方が良い理由を正当化してください。
  2. デフォルト権限からアプリケーション権限を分離するDefault_Permissionモデルを作成する方がよいですか?

EDIT:

私はどんな情報を見逃した場合はお問い合わせください。私は、いくつかの異なるソリューションとそれぞれのソリューションの仕組みを見たいと思います。ありがとう

答えて

1

私は、次のをお勧めします:

開発者は、ユーザーオブジェクトです。スキーマ内のis_developerブール値を持つユーザーと開発者を区別します。これにより、ユーザー/開発者を(switch文なしで)統合したままにすることが容易になります。

class User < ActiveRecord::Base 
    named_scope :regular_users, :conditions => { :is_developer => false } 
    named_scope :developers, :conditios => { :is_developer => true } 
    #you can then call User.regular_users or User.developers 
end 

また、多態性の関連付けとしてUser/Developerの作業を行うこともできます。例えば。

class Role < ActiveRecord::Base 
    belongs_to :entity, :polymorphic => true #with entity_id/entity_type in your schema 
end 

このアプローチの欠点は、セマンティックゲインがほとんどないかゼロになるようにコードを複雑にすることです。


私は本当にあなたがデフォルトの許可で意味するものを理解していませんが、データベースではなく論理的な問題であるようです。誰もデフォルトの許可を持っていますか? * after_create *に追加することもできますし、ロジックを書くときにはそれを真(またはブール値のフラグで制御)します。次のコードでは、各ユーザーのアクセス許可が作成された後にデフォルトでtrueになります(既存のユーザーの場合は、手書きタスクでアクセス許可を追加できます)。

class User < ActiveRecord::Base 
    after_create :add_default_permission 

    def add_default_permission 
    Permission.default_permissions.each do |permission| 
     self.app_permissions.create(:permission_id => permission.id) 
    end 
    end 
end 

default_permissionsについては、permissionsテーブルに* is_default * booleanを指定することをお勧めします。こうすることで、複数の既定のアクセス許可を引き継ぐことができます(または既定のアクセス許可を後で削除することもできます)。既定のアクセス許可は、アクセス許可がなので、オブジェクトモデルを区別する必要はありません。私。最後に

class Permission < ActiveRecord::Base 
    named_scope :default_permissions, :conditions => { :is_default => true } 
end 

、ユーザーがアプリをインストールする場合、すなわち

class User < ActiveRecord::Base 
    has_many :apps 
    has_many :permissions, :through => :app_permissions, :as => :permissible #edited 
end 

class App < ActiveRecord::Base 
    belongs_to :app_permission 
    has_many :permissions, :through => :app_permissions, :as => :permissible #edited 
end 

class Permission < ActiveRecord::Base 
    belongs_to :app_permissions 
    belongs_to :permissible, :through => :app_permissions, :polymorphic => true #edited 
end 

class AppPermission < ActiveRecord::Base 
    belongs_to :permissible, :polymorphic => true #edited 
    belongs_to :app 
end 

、完全にあなたのActiveRecordアソシエーションのすべてを綴るてください:多型については、以下のEDITED

Class User < ActiveRecord::Base 
    def get_required_app(app) 
    required_permissions = [] 
    app.permissions.each do |p| 
     if self.permissions.find(:first, conditions => { :permission_id => p.id }).nil? 
     required_permissions.push p 
     end 
    end 
    required_permissions 
    end 

    def install_app(app) 
    req = required_permissions app 
    return req if req.count > 0 
    #add user app 
    end 
end 

・ホープこれはあなたの問題を解決するのに役立ち、追加の情報が必要な場合は私に知らせてください。

+0

デフォルトのアクセス許可では、アプリケーションをインストールするときにユーザーに既定のアクセス許可が与えられます。アプリケーションをインストールした後、特定のアプリケーションの権限を変更できます。 – Immo

+0

許可はアプリケーション/ユーザー向けですか?例えば。 Bobは許可を得てPlaygroundをインストールし、その後Janeは許可を得てPlaygroundをインストールします。 'Build a new seesaw'? – ghayes

+0

いいえ。アプリケーションは、ディスクへの書き込み、ディスクからの読み取り、ディスクからの削除などを行うことができます。ディスクからの読み取り= true、ディスクからの削除= falseので、新しいアプリケーションをインストールするたびに、デフォルトのアクセス許可で受け入れなかったアクセス権のみを受け入れる必要があります。 – Immo

0

特定のビジネス要件が何であるかはわかりませんが、ほとんどの人は権限管理にロールベースのパターンを使用しています。詳しくは、this questionを参照してください。

+0

どのような情報が欠落していますか? – Immo

+0

いくつのパーミッションがいくつありますか?何人のユーザーがいますか?一般的なユーザーのアクセス許可が設定されているさまざまな方法と比較して、ユーザーは頻繁に出入りしますか?ロールベースのセキュリティを前提とすると、相対的に限られた数の比較的静的な許可パターンが存在することになります。多くのユーザーが同じパターンのパーミッションを持っていて、頻繁に行き来しているということです。すべてのユーザーが最終的に固有の権限セットを持つ場合、役割ベースのセキュリティは役立たない可能性があります。 –