0

現在、私のアプリでは、訪問者が持つことができる役割は 3 つだけです。

  • adminすべての特権を持つ
  • userシステム内で自分自身に関するいくつかのアクションを実行できる
  • guestバグレポートを見て送信できる

次のように、すべてがプリミティブに実装されています。DB では、各ユーザーには自分の存在admin(フィールドでの略2) またはuser( 1) が示されるフィールドがあり、application_controller.rbそれは単にチェックif logged_in? && current_user.DB_FIELD == 2(または> 0) され、必要なコントローラーでは発生します。小切手before_filterなど

ただし、システムの機能を拡張することを決定した最近まで、このような単純な実装はうまく機能していました。つまり、管理者がユーザーをグループに参加できるようにすることでした。私が質問しようとしていることをよりよく理解するために、私が見ている状況を説明させてください (もっと適切で論理的なものを提案できるかもしれません):

  1. 私は管理者です。を開く/groupsと、グループのリストが表示されます。
    • グループとは グループは、一方では権限のセットであり、他方では、アプリ内で同じ権限を持つ必要があるユーザーの組み合わせです。
    • 許可とは何ですか?パーミッションは、割り当てられたグループの各ユーザーが実行できる1 つのアクションです。
  2. 新しいユーザーを 1 つのグループにまとめたいのですが、このグループは存在しません。ボタン ( の略/groups/new) をクリックすると、[グループの作成] ウィンドウが表示されます。そこには、グループ名用のテキストフィールド、多数のチェックボックス、それぞれが許可を表すもの、ユーザーを追加するためのフィールド、および保存ボタンがあります。グループ名を書き、このグループに割り当てたいすべての権限を確認し、このグループにユーザーを追加します (これを ajax 検索で実装します。ユーザー名を入力し始めると、そのユーザーが表示され、Enter をクリックすると、ユーザーが追加されたら、必要に応じてこれらのアクションを繰り返します (それで問題ないでしょうか?)、[保存] をクリックします。
  3. わかりました、複数のユーザーを持つ新しいグループを取得しました。でもやめて、もう一人追加するのを忘れていたことに気付きました![グループの編集] ウィンドウ ( /groups/edit) に戻り、誤って入力されたフィールドを再入力します。[保存] をクリックし、もう一度マジック (つまり、DB に対する更新操作) をクリックします。

それで、最終段階で私は何を持っていますか?グループを自由にc/r/u/dして、ユーザーと権限を管理し、非常にGUI主導の方法で実行できます(つまり、チェックボックス、ajax検索フィールドなど)。

2週間、私はレールの役割とグループベースの承認に関する情報をグーグル/スタックオーバーフロー/精査してきました。cancan 、 easy_rolestrolesなどの多くの解決策を見つけましたが、動的 (またはカスタマイズ可能? または動的にカスタマイズ可能?) なグループベースのアプローチを実装する方法をそれらのいずれにも見つけることができません。私のニーズに本当に100%適合する唯一のものは、redmineパーミッションとパーミッショングループのアプローチですが、9000を超える機能のために複雑すぎて、実装方法を完全に理解することさえできませんでした。 .

そして質問は (権限のセットが永続的であるためハードコーディングできると仮定し、グループのセットは完全に無料であると仮定します; また、ユーザーがどのグループにも属していない場合、デフォルトのユーザー権限があります; さらに、権限c/r/u/d 操作だけでなく、手動で作成したメソッドにも使用できます):

  1. 上記のシステムを実装する最良の方法は何ですか? 私がまだ見つけていない既存の宝石やアプローチはありますか?
  2. 権限と権限グループを簡単にスケーラビリティに保存するにはどうすればよいですか? ビットマスク、または個別のアクセス許可、グループへのアクセス許可の割り当て、およびグループ テーブル?
  3. ユーザーを簡単にグループに入れる方法は? ユーザーの DB 行のグループ フィールド、または別のユーザーからグループへの割り当てテーブル?

できれば、ユーザーが追加されるグループに割り当てられたアクセス許可が、ユーザーの再ログインなしで即座に適用されることをお勧めします。

よろしくお願いします!

4

1 に答える 1

0

数夜かけて、ようやく解決策にたどり着きました。私の考えでは、これはかなり簡単でありながら強力ですが、明らかに最良の実装ではありません (ただし、それでもなお) 実装です。

これで、列がidname、およびであるグループの +1 テーブルができましたpermission。最後の列は、すべての権限を 10 進数で表す通常の整数です。

パーミッションはコントローラーで「エイリアス」されます。たとえば、 を1表し、 を表します。can_manage_smth2can_view_smth

許可選択パネルは /groups セクションにあり、チェックボックスの単純なセットであり、onchangeそれぞれにアクションを適用して、テーブルに格納されている許可で ajaxlyOR操作を実行します (たとえば1、 、8、およびの値を表す 3 つのチェックボックスを選択します)。 16、次に、テーブル25に入ります。これは、 の結果です1 | 8 | 16)。

だから私の質問に答える:

  1. 最善ではありませんが、それでも解決策です。
  2. 新しいパーミッションの追加 (これは非常にまれなアクションです) は、パーミッションの新しいエイリアスとコントローラーの先頭での before_filter チェックを要求するだけなので、スケーラビリティにはほとんど影響しません。また、ビットマスクを使用しましたが、バイナリとしてではなく、単純なバイナリ ロジック オペランドが使用できる通常の 10 進数値として使用しました。
  3. 個別のユーザーからグループへの割り当てテーブルはなく、テーブル内の単一のgroup_iduser(既に存在していた) のみです。

実装されたすべてが完全に機能することを願っています。問題が発生した場合は、ここに示します。また、新しい実装のアイデアがあれば。

とにかく、みんなありがとう!

于 2014-03-27T14:38:38.133 に答える