現在、私のアプリでは、訪問者が持つことができる役割は 3 つだけです。
admin
すべての特権を持つuser
システム内で自分自身に関するいくつかのアクションを実行できるguest
バグレポートを見て送信できる
次のように、すべてがプリミティブに実装されています。DB では、各ユーザーには自分の存在admin
(フィールドでの略2
) またはuser
( 1
) が示されるフィールドがあり、application_controller.rb
それは単にチェックif logged_in? && current_user.DB_FIELD == 2
(または> 0
) され、必要なコントローラーでは発生します。小切手before_filter
など
ただし、システムの機能を拡張することを決定した最近まで、このような単純な実装はうまく機能していました。つまり、管理者がユーザーをグループに参加できるようにすることでした。私が質問しようとしていることをよりよく理解するために、私が見ている状況を説明させてください (もっと適切で論理的なものを提案できるかもしれません):
- 私は管理者です。を開く
/groups
と、グループのリストが表示されます。- グループとは グループは、一方では権限のセットであり、他方では、アプリ内で同じ権限を持つ必要があるユーザーの組み合わせです。
- 許可とは何ですか?パーミッションは、割り当てられたグループの各ユーザーが実行できる1 つのアクションです。
- 新しいユーザーを 1 つのグループにまとめたいのですが、このグループは存在しません。ボタン ( の略
/groups/new
) をクリックすると、[グループの作成] ウィンドウが表示されます。そこには、グループ名用のテキストフィールド、多数のチェックボックス、それぞれが許可を表すもの、ユーザーを追加するためのフィールド、および保存ボタンがあります。グループ名を書き、このグループに割り当てたいすべての権限を確認し、このグループにユーザーを追加します (これを ajax 検索で実装します。ユーザー名を入力し始めると、そのユーザーが表示され、Enter をクリックすると、ユーザーが追加されたら、必要に応じてこれらのアクションを繰り返します (それで問題ないでしょうか?)、[保存] をクリックします。 - わかりました、複数のユーザーを持つ新しいグループを取得しました。でもやめて、もう一人追加するのを忘れていたことに気付きました![グループの編集] ウィンドウ (
/groups/edit
) に戻り、誤って入力されたフィールドを再入力します。[保存] をクリックし、もう一度マジック (つまり、DB に対する更新操作) をクリックします。
それで、最終段階で私は何を持っていますか?グループを自由にc/r/u/dして、ユーザーと権限を管理し、非常にGUI主導の方法で実行できます(つまり、チェックボックス、ajax検索フィールドなど)。
2週間、私はレールの役割とグループベースの承認に関する情報をグーグル/スタックオーバーフロー/精査してきました。cancan 、 easy_roles、trolesなどの多くの解決策を見つけましたが、動的 (またはカスタマイズ可能? または動的にカスタマイズ可能?) なグループベースのアプローチを実装する方法をそれらのいずれにも見つけることができません。私のニーズに本当に100%適合する唯一のものは、redmineパーミッションとパーミッショングループのアプローチですが、9000を超える機能のために複雑すぎて、実装方法を完全に理解することさえできませんでした。 .
そして質問は (権限のセットが永続的であるためハードコーディングできると仮定し、グループのセットは完全に無料であると仮定します; また、ユーザーがどのグループにも属していない場合、デフォルトのユーザー権限があります; さらに、権限c/r/u/d 操作だけでなく、手動で作成したメソッドにも使用できます):
- 上記のシステムを実装する最良の方法は何ですか? 私がまだ見つけていない既存の宝石やアプローチはありますか?
- 権限と権限グループを簡単にスケーラビリティに保存するにはどうすればよいですか? ビットマスク、または個別のアクセス許可、グループへのアクセス許可の割り当て、およびグループ テーブル?
- ユーザーを簡単にグループに入れる方法は? ユーザーの DB 行のグループ フィールド、または別のユーザーからグループへの割り当てテーブル?
できれば、ユーザーが追加されるグループに割り当てられたアクセス許可が、ユーザーの再ログインなしで即座に適用されることをお勧めします。
よろしくお願いします!