2008-09-13 12 views
7

いくつかのユーザー/ロールデータベーステーブルのデザインが受け入れ可能かどうかについて質問しましたが、いくつかの調査の後でこの質問に出くわしました:複数のアクセス許可の種類(ロール)を1つの10進数としてデータベースに格納

What is the best way to handle multiple permission types?

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

私はこの1頭の周りに私の脳を得ることはできません。誰かが変換プロセスを説明できますか?それは "右"と聞こえるが、私はそれがdbに入る前に小数点にどのように役割を変換するのか、dbから出てくるときにどのように変換されるのかを知りません。私は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進数に変換されます。 次に、1人のユーザーのアクセス許可をデータベースの1列に格納します(この場合は3になります)。

は、アプリケーションの内部で、あなただけのユーザーが特定の権限を持っているかいないかどうかを確認するために(OR)別のビット演算を必要としています。」

+0

非常に便利な質問と回答者... –

答えて

4

ビット単位の操作を使用します。擬似コードは次のようなものになるだろう:

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演算)を読み上げてください。

+0

この手法の欠点は、アクセス許可の定義が列挙型であるため、データベースに格納される内容を理解するためにアプリケーションへのアクセスが必要なことです。 –

+0

これは公正な文ですが、データベースのテーブルに値を定義することもできます(ただし、外部キーを使用することはできません)。この「欠点」は、データベース内の任意の整数ベースの列挙型に当てはまります。 – Brannon

+0

これが問題であれば、行ベースのロール(および多対多の関係)を常に使用できます。 – Brannon

3

実は、これは我々がかなり大規模なWebアプリケーション内で権限を決定する方法であるI 。。。「あなたはこのような何かをしようとしている場合は、あなたが本当にnumbers tableを持つの恩恵を受けるだろうそれははるかに速く、あなたの計算を行いますため

DBA m個

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

  1. グループ - 匿名認証のための値が含まれていると
  2. グループのセキュリティポイントがテーブルを結合する別のグループの一部ではない認証されたユーザのための1 - ユーザーおよびセキュリティの点
  3. セキュリティポイントの多くに多くを行うため
  4. ^2値のエントリを含む特別なBitMask番号テーブル。したがって、2(2)に対して1つのエントリがあり、3(2および1)に対して2つのエントリが存在する。これにより、毎回値を計算する必要がなくなります。

まず、ユーザーがログインしているかどうかを確認します。ログインしていない場合は、セキュリティポイントの匿名の承認を返します。

次に、ユーザがセキュリティポイントに関連付けられたグループのメンバーであるかどうかを、EXISTSJOINを使用して単純に決定します。一致しない場合は、認証されたユーザーに関連付けられた値を返します。特定のグループに所属する必要があるため、匿名で認証されたデフォルトのほとんどは私たちのシステム上で1に設定されています。

注:匿名ユーザーがアクセス権を取得しない場合、インターフェイスは、彼らがログインして、もう一度お試しできるようにするためにボックス内のログにそれらをオーバースローします。

ユーザは、1つ以上のグループのメンバーである場合、我々はグループのために定義された値のそれぞれに対してビットマスクテーブルから異なる値を選択します。たとえば、3つのグループに所属し、1つの認可レベルが8、1つが12、最後が36の場合、ビットマスクテーブルに対する選択は、それぞれ8,8,4、および4と32を返します。明確にすることによって、数字4,8、および32が正しくマスクされ、101100にマスクされます。

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

意味がありますか?

+0

このテクニックがどのように機能するかは間違いありません。あなたは深く掘り下げる必要はありませんが、特に変換プロセスをDBに格納されているものにどのようにマッピングするかについて、より詳細な情報が非常に役立ちます。 –

関連する問題