複数の権限タイプ (ロール) が 10 進数としてデータベースに保存される
-
09-06-2019 - |
質問
ここで、一部のユーザー/ロールのデータベース テーブルの設計が受け入れられるかどうかについて質問しようとしましたが、調べた結果、次の質問に遭遇しました。
これは革新的なアプローチのように聞こえるので、多対多の関係 users_to_roles テーブルの代わりに、複数の権限を単一の小数 (おそらく int データ型) として定義しています。つまり、1 人のユーザーのすべての権限が 1 行にまとめられています。他の質問と回答を読むまでは意味がわからないかもしれません
この件については頭が理解できません。誰か変換プロセスを説明してもらえますか?それは「正しい」ように思えますが、データベースに入る前にロールを10進数に変換する方法と、データベースから出てくるときにどのように変換して戻すのかがわかりません。私は Java を使用していますが、それをスタブアウトすると、それも素晴らしいでしょう。
他の質問が削除された可能性があるため、元の回答は次のとおりです。
「個人的には、フラグ付きのアクセス許可の列挙を使用することがあります。このようにして、列挙型の項目に対して AND、OR、NOT、および XOR のビット単位の演算を使用できます。
[Flags]
public enum Permission
{
VIEWUSERS = 1, // 2^0 // 0000 0001
EDITUSERS = 2, // 2^1 // 0000 0010
VIEWPRODUCTS = 4, // 2^2 // 0000 0100
EDITPRODUCTS = 8, // 2^3 // 0000 1000
VIEWCLIENTS = 16, // 2^4 // 0001 0000
EDITCLIENTS = 32, // 2^5 // 0010 0000
DELETECLIENTS = 64, // 2^6 // 0100 0000
}
次に、ビットごとの AND 演算子を使用して、いくつかの権限を組み合わせることができます。
たとえば、ユーザーがユーザーを表示および編集できる場合、操作のバイナリ結果は 0000 0011 となり、10 進数に変換すると 3 になります。その後、1 人のユーザーの権限をデータベースの 1 つの列 (この場合は 3 列) に保存できます。
アプリケーション内で、ユーザーが特定の権限を持っているかどうかを確認するには、別のビット単位の演算 (OR) が必要です。」
解決
ビット単位の演算を使用します。疑似コードは次のようになります。
bool HasPermission(User user, Permission permission) {
return (user.Permission & permission) != 0;
}
void SetPermission(User user, Permission permission) {
user.Permission |= permission;
}
void ClearPermission(User user, Permission permission) {
user.Permission &= ~permission;
}
権限は投稿で定義された列挙型ですが、どの型であっても整数のような型に基づく必要があります。同じことが User.Permission フィールドにも当てはまります。
これらの演算子 (&、|=、および &=) が意味を理解できない場合は、ビット単位の演算 (ビット単位の AND およびビット単位の OR) について読んでください。
他のヒント
実際、これは私が DBA を務めるかなり大規模な Web アプリケーション内の権限を決定する方法です。
このようなことを行う場合は、 数字の表. 。計算がはるかに速くなります。
基本的な設定には次のテーブルが含まれます。
- グループ - 多対多のユーザーとセキュリティ ポイントを実行するため
- セキュリティ ポイント - 匿名認証の値と、別のグループに属していない認証済みユーザーの値が含まれます。
- グループセキュリティポイント結合テーブル
- ^2 値のエントリを含む特別な BitMask 番号テーブル。したがって、2 (2) には 1 つのエントリがあり、3 (2 と 1) には 2 つのエントリがあります。これにより、毎回値を計算する必要がなくなります。
まず、ユーザーがログインしているかどうかを確認します。そうでない場合は、セキュリティ ポイントの匿名承認を返します。
次に、簡単な方法でユーザーがセキュリティ ポイントに関連付けられたグループのメンバーであるかどうかを判断します。 EXISTS
を使って JOIN
. 。そうでない場合は、認証されたユーザーに関連付けられた値を返します。特定のグループに所属する必要があるため、システムでは匿名および認証済みのデフォルトのほとんどが 1 に設定されています。
注記: 匿名ユーザーがアクセス権を取得しなかった場合、インターフェイスはユーザーをログイン ボックスにスローして、ログインして再試行できるようにします。
ユーザーの場合 は 1 つ以上のグループのメンバーである場合は、グループに定義された値ごとに BitMask テーブルから個別の値を選択します。たとえば、3 つのグループに属し、1 つの認証レベルが 8、1 つが 12、最後の認証レベルが 36 だった場合、ビット マスク テーブルに対する選択では、それぞれ 8、8 と 4、および 4 と 32 が返されます。Different を実行すると、ビット マスクを 101100 に正しく設定する数値 4、8、および 32 が得られます。
その値はユーザーの認証レベルとして返され、Web サイトによって処理されます。
意味をなす?