2011-10-20 6 views
2

ウェブアプリケーションのロールベースのセキュリティを実装しようとすると、権限、ロール、ユーザー、およびユーザーロール(ロールへのユーザーの割り当て)のためのデータベース内にテーブルがあります。権限にフラグ列挙型を使用することの短所は何ですか?

各ロールには一連の権限があります。権限は、0,1,2,4などの値を持つC#フラグenumとして定義されます。

データベースでは、ロールテーブルには、ロールの結合パーミッションフラグを格納するintフィールドがあります。 (このようにして、別々のパーミッションテーブル(それは良いか悪いのか?)とRolePermissionsの1対多テーブルを避けます。

コードでは、 。役割(複数可)は、ユーザーは、.NETでは、列挙型のフラグに論理演算を実行していることを行うことは非常に簡単ですに割り当てられている

だから私の質問は次のとおりです。

はそれをやってのが欠点であります(ロールに付与された権限ごとに1つのレコードが含まれるPermissionテーブルとRolePermissionリンクテーブルを持つのとは対照的に)

答えて

1

すぐれた3つの短所:

  • フラグには使用可能なビット数と同じ数の項目しか含めることができません。
  • データベースからのクエリーがもうちょっと面倒です。さて、SQLを手動で使用している場合のみ(メンバーシップを決定するためにロールテーブルに参加することはもっとうれしいです)。
  • フラグとしてではなくデータを見るとき、誰が4ビット目の1という値が何を意味するのかを覚えていますか?

別のリストを参照してください。コレクションに割り当てられているのはmyPermissions.Contains(new Permission("CanEdit"))に非常にうまくいきます。その後、さまざまな変換ルーチンを使用して、列挙型や文字列などのハードコードされた値をオブジェクトのアクセス許可の表現に変換することができます。

これは、別のテーブルよりもフラグを選択する際にパフォーマンスの影響があるとは言えません。あなたはどんな使い方を見ているのか分かりません。

+0

感謝。使い方はそれほどエキゾチックではありません。各テナントが独自のロール名を定義し、ユーザーをカスタムロールに割り当てることを望む、マルチテナント型Webアプリケーションです。彼らは、それぞれのカスタムロールに標準的な権限セットを割り当ててマップする必要があります。 – Krishna

1

唯一の欠点は、アクセス許可をチェックするためにコードをさらに作成することです。ユーザーロールを持つ別のテーブルを持つことで、それらを決定することが非常に簡単になります。

  • 利点:あなたのコードの複雑さ:デメリット
  • (?誰がこの シナリオにこの気)のストレージスペースを保存します。
+2

私は実際にコードがより単純だと思うでしょう。必要に応じてパーミッションを設定するだけです。 – Krishna

1

私は3年前にプロジェクトで説明したように、フラグ列挙型を使用しました。私の考慮事項は:

  • は使用を簡素化するレイヤーを作成するか、またはあなたは「新しい開発者のためのない直感的なフロントエンド
  • その中で汚いコードになってしまいます。他の誰かがこのコードを維持している場合、彼は全体のアイデアを逃して複雑性やバグを導入する可能性があることに注意してください...

Psの.:

各ロールは、権限のセットを有します。権限は、0,1,2,4などの値を持つC#フラグenumとして定義されます。

NEVERフラグ列挙型での使用0 ...

関連する問題