9

ここで、一部のユーザー/ロールデータベーステーブルの設計が受け入れられるかどうかについて質問するつもりでしたが、調査の結果、次の質問に遭遇しました。

複数の権限タイプを処理するための最良の方法は何ですか?

これは革新的なアプローチのように聞こえるので、多対多の関係users_to_rolesテーブルの代わりに、単一の小数として定義された複数のアクセス許可があります(私が推測するintデータ型)。これは、1人のユーザーに対するすべての権限が1行にあることを意味します。他の質問を読んで答えるまで、おそらく意味がありません

私はこれについて頭を悩ませることができません。誰かが変換プロセスを説明できますか?「正しい」ように聞こえますが、データベースに入る前にロールを小数に変換する方法と、データベースから出るときにロールがどのように変換されるのかがわかりません。私は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)が必要です。」

4

2 に答える 2

6

ビット演算を使用します。擬似コードは次のようになります。

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) を読んでください。

于 2008-09-13T00:58:29.343 に答える
3

実際、これが、私がDBAであるかなり大規模なWebアプリケーション内の権限を決定する方法です。

このようなことをする場合は、 数値テーブルを用意することで本当にメリットがあります。それはあなたの計算をはるかに速くします。

基本的なセットアップには、次の表が含まれています。

  1. グループ-多対多のユーザーとセキュリティポイントを実行するため
  2. セキュリティポイント-匿名認証の値と、別のグループに属していない認証済みユーザーの値が含まれています
  3. グループセキュリティポイント結合テーブル
  4. ^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が返されます。区別することにより、101100に正しくビットマスクする番号4、8、および32を取得します。

その値は、ユーザー認証レベルとして返され、Webサイトによって処理されます。

わかる?

于 2008-09-13T00:32:47.860 に答える