Railsでロールベースのアクセス制御システムを作成する方法を考えています。私はこれらの素晴らしいプロジェクトも(とりわけ)見ました:
私の質問は、すべての結合テーブルが本当に必要なのかということです。リレーションシップ内のテーブルの1つに値が少ない(たとえば100未満)場合、結合テーブルをその小さなテーブルとマージすることはできませんか?)これが意味します...必要なものは次のとおりです。
モデル
- ユーザー
- グループ
- 役割
- 許可
- UserRoles / RolesUsers
- GroupRoles
- メンバーシップ(GroupUsers)
- RolePermissions
そんな感じ...
RoleRequirementが機能する方法は、roles
テーブルとroles_users
結合テーブルを作成することです。これは、アプリケーションに合計20の可能な役割がある場合、次のことを意味します。
- 20行のロールテーブル
- n行のRolesUsersテーブル。
つまり、役割ごとにユーザーを検索するたびに、参加する必要があります。ただし、アプリケーションにはロールが数個しかないため、この移行を置き換えてみませんか。
create_table "roles", :force => true do |t|
t.string "name"
end
create_table "roles_users", :id => false, :force => true do |t|
t.integer "role_id"
t.integer "user_id"
end
これで...
create_table "roles", :force => true do |t|
t.string "name"
t.integer "user_id" # or some polymorphic form
end
これにより重複が発生します(たとえば、「admin」という名前のロールが大量にあります)が、スペースが安価であり、Role.unique
すべての一意のロールを検索するようなメソッドを作成できるため(20行のテーブルを削除するため)、なぜ人々は作成するのですか?結合テーブル?
パーミッションについても同じです。開始するパーミッションは4つだけですcreate read update delete
。したがって、パーミッションテーブルとroles_permissionsテーブルは必要ありません。CRUDパーミッションを複製して、パーミッションテーブルにrole_idを含めることができます。roles
グループと同じように、テーブルに多態的な列がある場合は、グループロールは必要ありません。
これを行うための推奨される方法は何ですか?
提案された移行のスニペットを次に示します。