我相信您的问题是关于授权,而不是身份验证。如果我是对的,那么大概您已经知道用户是谁(身份验证,可能使用 cookie 或其他东西)。
现在,您必须想出一种方法来确定允许他们做什么(授权)。
授权逻辑确实是一个关键的设计决策。因此,它很重要,并且在很大程度上取决于数据模型的形状和应用程序的架构。
如果您可以通过对数据应用规则来始终如一地确定是否应该允许这样做,例如上面昆汀的回应(居住在区域 2 足以使用户可以加入组 2),那么通常最简单的方法是您的实体模型中的此逻辑。在这种情况下,我会在 User 上创建一个方法来检查他们是否可以加入该组......
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);
}
您还可以向 Group 添加一个函数,该函数代表这个新的 User 函数:
function addUser($user) {
$user->joinGroup($this);
}
OTOH,如果关于谁可以做什么的决定是基于更细化的权限,或者基于管理员或用户需要能够在运行时更改的信息,那么您将不得不变得更加花哨。一种常用、通用且灵活的方法称为基于角色的访问控制(又名 RBAC)。
这可能会变得非常复杂,但是应用于您的案例的核心概念是您有一个用户、实体(组)和一个操作(加入)。您需要确定是否允许用户 1 以组 2 作为参数执行名为“加入”的操作。
为此,您必须在某处保留一组规则,然后做两件事:
- 将新用户和组添加到系统或管理员更改其权限时,使这些表保持最新
- 检查每个请求的这些表以查看用户是否可以对实体执行操作(检查用户是否可以加入组)
我不会深入探讨这个用例的底层细节。可以这么说,如果您今天要完成的工作最终需要发展成一个相当复杂的权限系统,那么您最好学习一下 RBAC。