25

多くの異なる種類のアクセス許可を提供する必要がある次のシナリオに遭遇することがよくあります。私は主に SQL Server 2000 で ASP.NET / VB.NET を使用しています。

シナリオ

さまざまなパラメーターで機能する動的許可システムを提供したいと考えています。部門または特定の人物だけにアプリケーションへのアクセス権を付与したいとしましょう。そして、成長し続ける多くのアプリケーションがあるとします。

過去に、私はこれを行うために知っている次の 2 つの方法のいずれかを選択しました。

  1. パラメータの適用方法を決定するために使用される特別な列を持つ単一の権限テーブルを使用します。この例の特別な列はTypeIDTypeAuxIDです。SQL は次のようになります。

    SELECT COUNT(PermissionID)
    FROM application_permissions
    WHERE
    (TypeID = 1 AND TypeAuxID = @UserID) OR
    (TypeID = 2 AND TypeAuxID = @DepartmentID)
    AND ApplicationID = 1
    
  2. 権限の種類ごとにマッピング テーブルを使用し、それらをすべて結合します。

    SELECT COUNT(perm.PermissionID)
    FROM application_permissions perm
    LEFT JOIN application_UserPermissions emp
    ON perm.ApplicationID = emp.ApplicationID
    LEFT JOIN application_DepartmentPermissions dept
    ON perm.ApplicationID = dept.ApplicationID
    WHERE q.SectionID=@SectionID
      AND (emp.UserID=@UserID OR dept.DeptID=@DeptID OR
     (emp.UserID IS NULL AND dept.DeptID IS NULL)) AND ApplicationID = 1
    ORDER BY q.QID ASC
    

私の考え

例が理にかなっていることを願っています。私はそれらを一緒に石畳にしました。

最初の例は作業が少なくて済みますが、どちらも最良の答えとは思えません。これを処理するより良い方法はありますか?

4

5 に答える 5

14

私はジョン・ダウニーに同意します。

個人的には、フラグ付きのアクセス許可の列挙を使用することがあります。このようにして、列挙の項目に対して 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) が必要です。

于 2008-08-04T18:23:40.537 に答える
10

私がパーミッション システムをコーディングする際の通常の方法は、6 つのテーブルを使用することです。

  • ユーザー - これは非常に簡単です。典型的なユーザー テーブルです。
  • グループ - これはあなたの部門と同義です
  • 役割 - これは、一般的に人間が読める名前と説明を含むすべての権限を持つテーブルです。
  • Users_have_Groups - これは、ユーザーが属するグループの多対多のテーブルです
  • Users_have_Roles - 個々のユーザーに割り当てられているロールの別の多対多テーブル
  • Groups_have_Roles - 各グループが持つロールの最終的な多対多テーブル

ユーザー セッションの開始時に、ディレクトリまたはグループを通じて割り当てられたすべてのロールを引き出すロジックを実行します。次に、これらのロールに対して、セキュリティ アクセス許可としてコーディングします。

私が言ったように、これは私が通常行うことですが、あなたのミラージュは異なる場合があります.

于 2008-08-04T17:56:26.643 に答える
2

正直なところ、ASP.NETメンバーシップ/ロール機能は、説明したシナリオで完全に機能します。独自のテーブル/プロシージャ/クラスを作成することは素晴らしい演習であり、細部を非常にうまく制御できますが、これを自分で行った後、組み込みの.NETのものを使用する方がよいと結論付けました。既存のコードの多くは、それを回避するように設計されています。ゼロから書くのに約2週間かかりましたが、.NETほど堅牢ではありませんでした。あなたは非常に多くのがらくた(パスワード回復、自動ロックアウト、暗号化、役割、許可インターフェース、大量のprocなど)をコーディングする必要があり、その時間は他の場所でよりよく費やされる可能性があります。

申し訳ありませんが、あなたの質問に答えなかった場合、私は誰かがvbの質問をしたときにc#を学ぶように言う人のようです。

于 2008-08-07T02:23:18.460 に答える
2

John Downey と jdecuyper のソリューションに加えて、ビットフィールドの末尾/先頭に「明示的な拒否」ビットも追加しました。これにより、グループ、ロール メンバーシップごとに追加のアクセス許可を実行し、明示的な拒否に基づいてアクセス許可を差し引くことができます。エントリは、NTFS の動作と同様に、パーミッションに関してです。

于 2008-08-04T18:39:56.120 に答える
0

私がさまざまなアプリケーションで使用してきたアプローチは、変更可能な Value プロパティを持つ汎用の PermissionToken クラスを使用することです。次に、要求されたアプリケーションを照会すると、それを使用するために必要な PermissionTokens が通知されます。

たとえば、Shipping アプリケーションは、次のものが必要であると通知する場合があります。

new PermissionToken()
{
    Target = PermissionTokenTarget.Application,
    Action = PermissionTokenAction.View,
    Value = "ShippingApp"
};

これは明らかに、作成、編集、削除などに拡張できます。また、カスタム Value プロパティにより、任意のアプリケーション、モジュール、またはウィジェットで、独自の必要なアクセス許可を定義できます。YMMV ですが、これは私にとって常に効率的な方法であり、拡張性に優れていることがわかりました。

于 2008-08-04T18:03:57.190 に答える