あなたの質問は認証ではなく承認に関するものだと思います。私が正しければ、おそらくあなたはユーザーが誰であるかをすでに知っているでしょう(認証、おそらくクッキーか何かを使用する)。
ここで、許可されていること(承認)を決定する方法を考え出す必要があります。
承認ロジックは、実際には重要な設計上の決定事項です。そのため、これは重要であり、データモデルの形状とアプリケーションのアーキテクチャに大きく依存します。
上記のQuentinの応答(ユーザーがグループ2に参加できるように、リージョン2に住んでいるだけで十分な場合)のように、データにルールを適用することでこれを許可する必要があるかどうかを一貫して判断できる場合は、通常、最も簡単に配置できます。エンティティモデルのこのロジック。その場合、ユーザーにメソッドを作成して、グループに参加できるかどうかを確認します...
function canJoinGroup($group) {
//if(all is well), then:
return true
}
または、許可されていない場合にエラーをスローする、それらを結合するメソッドを作成します。
function joinGroup($group) {
//if(all is well), then:
return true;
//otherwise:
throw new Exception("User ". $this->id ." cannot join group " . $group->id);
}
この新しいユーザー関数に委任する関数をグループに追加することもできます。
function addUser($user) {
$user->joinGroup($this);
}
OTOH、よりきめ細かい権限に基づいて、または管理者またはユーザーが実行時に変更できる必要がある情報に基づいて、誰が何を実行できるかについての決定を行う場合は、より多くのことを行う必要があります。一般的に使用される、用途が広く、柔軟なアプローチは、役割ベースのアクセス制御(別名RBAC)と呼ばれます。
これは非常に洗練されたものになる可能性がありますが、ケースに適用されるコアコンセプトは、ユーザー、エンティティ(グループ)、およびオペレーション(参加)があるということです。ユーザー1がグループ2を引数として「join」と呼ばれる操作を実行できるかどうかを判断する必要があります。
これを行うには、一連のルールをどこかに保持してから、次の2つのことを行う必要があります。
- 新しいユーザーとグループがシステムに追加されたとき、または管理者が権限を変更したときに、これらのテーブルを最新の状態に保ちます
- リクエストごとにこれらのテーブルをチェックして、ユーザーがエンティティで操作を実行できるかどうかを確認します(ユーザーがグループに参加できるかどうかを確認します) 。
このユースケースの低レベルの詳細については説明しません。今日達成しようとしていることが最終的にかなり洗練されたアクセス許可システムに成長する必要がある場合は、RBACについて勉強することをお勧めします。