私のアプリケーションにはユーザーと管理者がいます。管理者は、super-adminとlimited-adminの2つに分かれます。 superはすべての権限を取得しますが、制限は特に必要な管理者権限のみを継承するように構成できます。
私は自分の許可を次のように定義することを考えています。すべてのユーザー権限には管理者権限があります。
ユーザー:
-post_create
-post_update
-post_delete
管理者:
-administrator_post_create
-administrator_post_update
-administrator_post_delete
これは良いアプローチですか?管理者にすべてのユーザー権限を割り当ててから、所有権チェックをバイパスして管理者が変更できる「administrator_post_manage_all」などの別の権限を割り当てる必要がありますか?
編集
次のルールが満たされている必要があります:
一部のユーザーのみが投稿を作成、更新、削除できます。ただし、更新、削除するには投稿の所有者である必要があります。アプリケーションのすべてのユーザーが投稿を読むことができる必要があります。管理者は、ユーザーの投稿を更新および削除できる必要があります。
私は数十のソフトウェアでこれらの認証の問題に対処してきましたが、その過程でこれが最良の解決策であることがわかりました。
CRUD操作:ユーザーがエンティティを削除または更新できるが、エンティティを作成できないなどの状況に直面したことがないので、ユーザーがエンティティを変更できる場合は、彼はそれを作成、更新、削除できます。
ただし、要件に応じて、ユーザーは任意の投稿を読み取り、管理者は他のユーザーの投稿を更新/削除できるため、権限を次のようにモデル化します。
ここで最も重要なのは、アクセス許可のセマンティクスと意味が要件に完全に一致しているため、実装が容易になることです。
したがって、管理者にはpost_modify
およびpost_modify_others
権限が割り当てられ、ユーザーにはpost_modify
権限のみが割り当てられます。
ユーザーグループ:通常、ユーザーとその権限を特定のテーブルに格納しますが、ユーザーと権限の数が増え始めたら、ユーザーと権限をリンクする別のテーブルを作成することをお勧めします(例:ユーザーグループ)管理を容易にするため。したがって、管理者とユーザーの2つのグループがあり、システムでの役割に応じてユーザーをこれらのグループに割り当てます。アクセス許可は、ユーザーごとではなくグループごとに割り当てられます。
次に、将来のより複雑な状況を処理できるアクセス許可を格納するための一般的なデータモデルについて考えることをお勧めします。この回答には優れた抽象概念があります https://stackoverflow.com/a/10311479/329496 権限のテーブルを使用し、別のロールを権限にリンクし、別のユーザーをロールにリンクし、もう1つをユーザーに直接権限を与える。そのデータモデルを使用して、テーブルに行を手動で挿入し、クエリを実行して、どのユーザーにどの権限を付与するかを選択できます。その後、アプリケーションがさらに複雑になった場合、クエリを変更せずに行を追加できます。