質問

ユーザー > オブジェクトの権限の理想的な構造は何でしょうか。

一般的な権限、つまりユーザーがアクセスできるセクションについて多くの関連投稿を見てきました。 users, userGroups そして 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)

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

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

そこで質問ですが、上記の構造を使用する必要がありますか?それとも誰かが私により良い方向を教えてくれますか?


編集

別の方法は、オブジェクトのタイプごとに権限テーブルを作成することです。

役に立ちましたか?

解決

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

権限 -- Grant を追加することを検討してください。オブジェクトに対する許可権限を持つユーザーは、他のユーザーに問題のオブジェクトへのアクセスを許可できます。

「迅速にスケーリングする必要がある」ことに注意してください。実際の生産体験がなければ、スケーリングされたシステムが本当に必要とするものがないと推測するのは難しいです。

また、権限システムを複雑にしすぎないように注意してください。システムが複雑すぎると検証が難しくなり、解読が容易になります。シンプルなシステムは、複雑なシステムよりもスケールアップのためのリファクタリングがはるかに簡単です。

スキーマはユーザーをオブジェクトに関連付けているようです。主キーと一意のインデックスを (user_id, object_id) にしますか?つまり、各ユーザーがオブジェクトごとに 0 または 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
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top