2

ユーザー > オブジェクトのアクセス許可の理想的な構造は何でしょうか。

一般的なアクセス許可、またはユーザーがアクセスできるセクションusersuserGroupsおよびuserGroupRelationsまたはその性質の何かで構成される関連する投稿をたくさん見てきました。

私のシステムには、作成できるさまざまなオブジェクトが多数あり、それぞれをオンまたはオフにできる必要があります。たとえば、グループとサブグループを持つパスワード マネージャーを考えてみましょう。

Group 1
    Group 2
    Group 3
    Group 4
Group 5
   Group 6
Group 7
   Group 8
       Group 9
       Group 10

各グループには一連のパスワードを含めることができます。ユーザーには、任意のグループに対する読み取り、書き込み、編集、および削除のアクセス許可を与えることができます。いつでも追加のグループを作成できます。

誰かがグループへのアクセス許可を持っている場合、私は彼にすべてのサブグループへのアクセス許可を持たせるか、そのグループだけに制限することができるはずです.

私の現在の考えは、ユーザーテーブルを作成してから、次のような列を持つアクセス許可テーブルを作成することです。

permission_id (int) PRIMARY_KEY
user_id (int) INDEX
object_id (int) INDEX
type (varchar) INDEX
admin (bool)
read (bool)
write (bool)
edit (bool)
delete (bool)

これは過去に機能していましたが、私が構築している新しいシステムは迅速に拡張できる必要があり、これが最適な構造であるかどうかはわかりません。また、グループのすべてのサブグループ権限を持つ人を持つという考えをより困難にします.

ユーザー/管理者の役割については別の表があります。これは、制御できるグループの下でユーザーの権限を変更できることを意味します。

それで、質問として、上記の構造を使用する必要がありますか?または、誰かが私をより良い方向に向けることができますか?


編集

別の方法として、すべてのタイプのオブジェクトに対して権限テーブルを作成する方法があります。

4

1 に答える 1

2

「last_update」タイムスタンプと「last_updated_by_user」列を追加して、実行中のシステムでこのテーブルへの変更を追跡できるようにすることをお勧めします。

許可を追加することを検討できます-付与。オブジェクトに対するグラント権限を持つユーザーは、問題のオブジェクトへのアクセスを他のユーザーに許可することができます。

「迅速にスケーリングする必要がある」場合は注意してください。実際の運用経験がなければ、スケールアップされたシステムに本当に必要なものを推測するのは困難です。

また、許可システムを過度に複雑にしないように注意してください。過度に複雑なシステムは検証が困難であり、その結果クラックされやすくなります。単純なシステムは、より複雑なシステムよりもスケールアップのためにリファクタリングする方がはるかに簡単です。

あなたのスキーマは、ユーザーをオブジェクトに関連付けているようです。主キーと一意のインデックスを (user_id, object_id) にしますか? つまり、各ユーザーが各オブジェクトに対してゼロまたは 1 つのアクセス許可エントリを持つようにするか? その場合は、提案した代理permission_idキーを使用するのではなく、主キーを使用してそれを強制してください。

階層に存在するオブジェクトについては、システム全体で次の 2 つの選択肢のいずれかを選択する必要があります。

  1. サブオブジェクトを持つオブジェクトへの許可は、オブジェクトへのアクセスのみを暗黙的に許可します。または...

  2. また、すべてのサブオブジェクトへのアクセスも許可します。

2 番目の選択肢は、新しいサブオブジェクトが作成されるときに許可を明示的に付与する負担を軽減します。最初の選択肢はより安全です。

2 番目の選択肢では、ユーザーが特定のオブジェクトにアクセスできるかどうかを判断するのが難しくなります。これは、ユーザーがアクセス権を持っているかどうかを確認するときに、オブジェクト階層をツリーのルートに向かって移動し、親オブジェクトに対するアクセス許可を探す必要があるためです。そのパフォーマンスの問題が意思決定を左右するはずです。ユーザーはいくつかのオブジェクトを作成し、それらに頻繁にアクセスしますか? それとも、多くのオブジェクトとサブオブジェクトを作成し、めったにアクセスしないでしょうか? アクセスが作成よりも頻繁に行われる場合は、最初の選択肢が必要です。オブジェクト アクセス時のパーミッション検索ヒットではなく、オブジェクト作成時のパーミッション付与オーバーヘッド ヒットを取り上げます。

おそらく第一候補の方が優れていると思います。このテーブル レイアウトをお勧めします。

user_id (int)
object_id (int)
type (varchar)  (not sure what you have this column for)
admin (bool)
read (bool)
write (bool)
edit (bool)
grant (bool)
delete (bool)
last_update (timestamp)
last_updated_by_user_id (int)
primary key = user_id, object_id.

また、このテーブル レイアウトを使用して、オブジェクトごとに各ユーザーに付与された個別のアクセス許可ごとにテーブルに行を作成することもできます。これは、より多くの種類のアクセス許可を追加すると、より簡単にスケールアップできます。

user_id (int)
object_id (int)
permission_enum (admin/read/write/edit/grant/delete)
type (varchar)  (not sure what you have this column for)
last_update (timestamp)
last_updated_by_user_id (int)
primary key = user_id, object_id, permission_enum
于 2010-06-14T02:05:39.193 に答える