61

「管理者」Web アプリケーションのアクセス許可システムを設計する最善の方法を検討しています。アプリケーションには多くのユーザーが含まれる可能性が高く、各ユーザーに特定のロールを割り当てることができます。これらのユーザーの一部は、ロール外で特定のタスクを実行することを許可される可能性があります。

これを設計するには 2 つの方法が考えられます。1 つは、すべてのユーザーの行を含む「アクセス許可」テーブルと、タスクごとに 1 つのブール列を使用して、それらのタスクを実行するアクセス許可をユーザーに割り当てます。このような:

ユーザー ID ユーザーの管理 製品の管理 プロモーションの管理 注文の管理
1 真 真 真 真
2 偽 真 真 真
3 偽偽偽真

私が考えた別の方法は、これらのユーザー権限を保存するためにビット マスクを使用することでした。これにより、管理できるタスクの数が 32 ビット符号付き整数の 31 に制限されますが、実際には、ユーザーが実行できる特定のタスクが 31 を超えることはほとんどありません。この方法では、データベース スキーマがより単純になり、アクセス制御が必要な新しいタスクを追加するたびにテーブル構造を変更する必要がなくなります。このような:

ユーザー ID のアクセス許可 (8 ビット マスク)、表では int になります
1 00001111
2 00000111
3 00000001

ここの人々は通常、どのようなメカニズムを使用しており、その理由は何ですか?

ありがとう!

4

9 に答える 9

83

宇宙の意味をエンコードする神秘的なビットストリングから離れることは、一般的な経験則だと思います。

扱いにくいかもしれませんが、可能なパーミッションのテーブル、ユーザーのテーブル、およびそれらの間のリンク テーブルを用意することが、これを整理するための最良かつ最も明確な方法です。また、クエリとメンテナンス (特に新しい人にとって) がずっと簡単になります。

于 2008-10-13T22:42:00.667 に答える
34

Permission テーブルを作成してから、関係を格納する UserPermission テーブルを作成するのはどうですか?

構造を再度変更する必要はなく、必要な数のアクセス許可を追加することができます。

于 2008-10-13T22:32:02.637 に答える
25

私はそれを両方の方法で行いました。しかし、ビットマスクはあまり使用しなくなりました。ユーザー ID またはグループ ID を外部キーとして指定すると、相互参照として使用できる別のテーブルで問題ありません。

UserID | Permission
===================
1      | 1              1 representing manage users
1      | 2              2 being manger products
2      | 3 

この方法は、後で維持して追加するのが簡単になります。

また、別のテーブルを使用して、アクセス許可を管理します。

PermissionID | Description
==========================
1            | Manage Users
2            | Manager Products
于 2008-10-13T22:38:16.353 に答える
10

通常、Users テーブル、Roles テーブル、および UserRoles テーブルがあります。このようにして、データベース構造を変更せずに無制限の量のロールを持つことができ、ユーザーは複数のロールに属することができます。

アプリケーションがロールに対してのみ承認するように強制します (ユーザーではありません)。ロール テーブルの "id" 列が ID 列ではないことに注意してください。これは、アプリケーションが特定の ID を探す必要があるため、このテーブルに配置される ID を制御する必要がある場合があるためです。

構造は次のようになります。

create table Users (
 id int identity not null,
 loginId varchar(30) not null,
 firstName varchar(50) not null,
 etc...
)

create table Roles (
 id int not null,
 name varchar(50) not null
)

create table UserRoles (
 userId int not null,
 roleId int not null
)
于 2008-10-13T23:43:35.707 に答える
4

管理された環境にいる場合は、Active Directory または別の LDAP 実装を使用できます。こうすることで、アクセス許可を決定するセキュリティ グループは、おそらく既に使い慣れたテクノロジを使用して、最前線のサポートによって管理できます。

アプリがシュリンク ラップされている場合は、アプリで拡張可能なデータ モデルを使用できるように、データベースを正規化するという Levi Rosol の提案に +1 してください。

于 2009-04-10T23:10:02.413 に答える
3

ロール プロバイダーの概念を使用して、Web アプリケーションのアクセス許可を抽象化することをお勧めします。バージョン 2.0 以降、これは .NET でSystem.Web.Security.RoleProviderとして提供されます。

基本的な考え方は、特定のストレージ メカニズムではなく、フレームワークに対してパーミッション チェックを記述することで、既存のフレームワークを活用することです。次に、XML ファイル、データベース、またはWindows ソフトウェア Authorization Manager を使用する承認ストアであっても、使用可能なストレージ メカニズムをプラグインできます (これにより、カスタム アクセス許可を LDAP にシームレスに結び付けることができます。構成に必要なコード)。

データベースをストレージ メカニズムとして使用することにした場合、フレームワークが必要とする基礎となるテーブルの自動作成のために、いくつかのデータベースがサポートされます。これには、Mono での .NET の実行と、MySQL 上でのロール プロバイダー モデルの使用が含まれます。

詳細については、ロール プロバイダーの実装を参照してください。他の言語/環境にも、この概念を実装するために利用できるライブラリがある可能性は十分にあります。調べる価値があります。

編集: また、web.config ファイルを使用して Web アプリケーションをストレージ メカニズムに結び付ける方法の構成を指摘する必要があり、コードの変更は必要ありません。これは、通常のデータベース プロバイダーの代わりに XML ファイルを使用してアクセス許可を模倣し、web.config の 2 行をすべて変更して、ローカル マシンでコードベースの実稼働バージョンをテストするのに非常に便利であることがわかりました。

忘れていたもう 1 つのことは、基本クラスを拡張することで独自のカスタム プロバイダーをプラグインできることです。これにより、パーミッション モデルを活用しながら、独自のストレージ システムを引き続き使用できます (たとえば、本当に必要な場合はビット マスク)。 .

于 2008-10-13T22:44:32.720 に答える
1

あなたが提案しているものに似た、幾分制限された権限システムと、本当にひどいシステムをいくつか見てきました。いくつかの単純な状況では、アプリケーションがより複雑にならない限り、許容できる場合があります。ただし、非常に多くの場合、システムはより複雑になり、必要な機能に対応するためにシステムを書き直す必要があります。

いつか表現力が必要になると思われる場合は、ユーザーとグループ (またはロール) を含む完全な ACL (アクセス制御リスト) システムを使用します。つまり、パーミッションによって管理されるそれぞれのもの (「ユーザーの管理」、「製品の管理」など) には、アクセス権を持つすべてのユーザーとグループのリストである ACL があります。その後、ユーザーは関連する ACL に直接追加されるか、すでに ACL のメンバーであるグループに追加されます。

ACL はリストの実装を提案していますが、テーブルを使用したほうがよいでしょう。この答えは良い方法です。

于 2008-10-13T22:41:05.753 に答える
0

アクセス権は通常、1、0、または null (継承を示す) を含むキーワードです。ビット システムでは、ユーザー ID とパーミッション キーワードでインデックスを作成できない可能性があります。代わりに、すべてのレコードをスキャンして許可値を取得する必要があります。

私は最初のオプションを選ぶと思います。それは私にはより良い解決策のようです:

create table permissions (
    user_id INT NOT Null,
    permission VARCHAR(255) NOT NULL,
    value TINYINT(1) NULL
)
alter table `permissions` ADD PRIMARY KEY ( `user_id` , `permission` ) 
于 2008-10-13T22:32:55.957 に答える