1

誰でも助けることができますか?

アクセス許可を管理するための優れたリレーショナル モデルを作成したいと考えています。

現在、Users テーブルと、Customers、Suppliers などのさまざまなテーブルがあります。

ユーザーには、Customers または Suppliers のいずれかで表示、編集、作成する権限が必要です。

これらのテーブルを EF で使用して、ユーザーが持つアクセス権と天気を判断してフォームを表示するかどうかなどを決定します。

私の元のモデルは次のようになりますが、パーミッションについて何も述べていないため、間違っていると思います。

Users UsersCustomers (Users と Customers の間の関係を含む) UsersSuppliers (Users と Suppliers の間の関係を含む) Customers (customer テーブル) Suppliers (suppliers テーブル)。

これは機能しますが、たとえば、ユーザーを顧客に関連付けます...それは正しくないようです。

ユーザーテーブルをリンクするIDとUserIdを持つPermissionsという中間テーブルを置くことを考えていました。次に、アクセス許可を次のようなテーブルにリンクできます

アクセス許可と顧客の間の関係を含む PermissionsCustomers (UsersCustomers の代わり)。

これは、最適な設計が得られていないところだと思います。この設計が正しければ、ユーザーが顧客に持つ権限のタイプ (編集、作成、または表示のみなど) を割り当てるためのテーブルも欠落します。

フィードバックや、このように機能する強力なモデルの例を聞きたいです。

顧客、サプライヤーに関しては、これらは 2 つの例に過ぎず、deliveryLocation、accountsLedger などのテーブルがさらにたくさんあります。

「ユーザーXが持っているすべての権限を表示する」というクエリを実行できれば素晴らしいと思います.現在、私のセットアップでは、各中間テーブルを個別にクエリする必要があります.

ORM のようなエンティティ フレームワークを介してこれを使用します。

リレーショナル モデルの構造に少し迷いました。

前もって感謝します。

4

1 に答える 1

3

顧客とサプライヤの数が非常に少ない (合計 20) ことを考えると、非常に複雑なシステムは必要ありません。

同様の状況で私が行ったことは、次のような構造のアクセス許可テーブルをセットアップすることです。

  • UserId (ユーザー ID )
  • RoleId (「顧客の編集」、「サプライヤーの削除」、「顧客の表示」などの役割テーブルにリンクする ID)
  • ObjectId (これは、保護するオブジェクトを識別する ID であり、サプライヤー ID または顧客 ID のいずれかです。)

ロール テーブルには次のものが含まれます。

  • ID (権限テーブルの RoleId に関連する一意の ID)
  • 名前 (役割の一意の名前、つまり「顧客の編集」)

次に、各ユーザー エンティティはアクセス許可のテーブルにリンクされ、各ユーザーは複数のアクセス許可を持ちます。ユーザーがログインするとき、私は通常、すべての権限をメモリ内のリストにロードすることを選択します。これにより、ユーザーは権限のリストを持つことになります。アクセス許可リストには、ObjectId、および RoleName および/または RoleId のみが含まれます (以下の例でわかるように、コードを読みやすくするために rolename を使用する傾向があります)

protected bool HasPermission(long ObjectId, string RoleName)
{

//Users in the Administrator role have access to everything in the system.
if (this.IsAdministrator) {
    HasPermission = true;
    return;
}

foreach (Permission P in Permissions) {
    if (P.ObjectID == ObjectID & P.RoleName == Role) {
        HasPermission = true;
        return;
    }
}
return false;

}

次に、ユーザーが何かに対する許可としてあるかどうかを知りたい場合は、次のようにします。

if (myUser.HasPermission(CustomerId, "Edit Customer") {
  //allow the user to edit the customer
else
  //allow the user to only view the customer (for example)

また

    if (myUser.HasPermission(SupplierId, "Print Supplier") {
  //allow the user to print the record
else
  //give user a warning

重要なのは、各「役割」が一意である必要があることです。同じ ID を持つ顧客とサプライヤーがあり、ユーザーに権限があるかどうかを確認したい場合、一般的な「編集」役割を持つことはできません。 'Edit' に変更すると、間違った結果が得られる可能性があります。したがって、「顧客の編集」という役割と、「仕入先の編集」という別の役割が必要です。

このソリューションはうまく拡張できませんが、セキュリティで保護する必要があるレコードが数十個しかないデータベースの場合、問題なく機能し、実装と保守が簡単です。また、真のリレーショナルな方法で設定されていません。つまり、アクセス許可テーブルの ObjectId は、サプライヤー テーブルまたは顧客テーブルのいずれにも関連付けられていません。

(また、このシナリオでは、私のユーザー オブジェクトはそれが管理者であるかどうかを認識しています。管理者はアクセス許可のセットアップを必要とせず、すべてにアクセスできるため、アクセス許可の検索は必要ありません - 数ナノ秒の時間を節約できます)

于 2011-08-14T13:35:00.463 に答える