在过去的几天里,我想知道它是如何做到的?如何验证/授权用户可以通过AJAX请求数据。
现在,我使用auth.But的会话,这只是一个次要的保护。
假设我有一个名为addUserToGroup($user_id,$group_id)的函数,它是通过
EXAMPLE: www.mysite.com/addUserToGroup/1/2 ( user_id = 1 , group_id = 2 )如何检查该用户是否被允许加入group_id=2?每个人都可以把数据发布到我的服务器上...
我发现的一种解决方案是使用jcryption (公钥/私钥方法)。但我认为,一定有一种更简单的方法来检查是否允许user_id =1加入group_id = 2。
提前感谢!
发布于 2012-08-18 05:55:41
我相信你的问题是关于授权的,而不是认证的。如果我是对的,那么您可能已经知道用户是谁(身份验证,可能使用cookie或其他东西)。
现在,您必须想出一种方法来确定允许他们做什么(授权)。
授权逻辑实际上是一个关键的设计决策。因此,它很重要,并且在很大程度上取决于应用程序的数据模型和体系结构的形状。
如果您可以一致地通过将规则应用于数据来确定是否应该允许这样做,例如在上面的Quentin响应中(其中居住在区域2中足以使用户加入Group 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添加一个委托给这个新用户函数的函数:
function addUser($user) {
$user->joinGroup($this);
}OTOH,如果关于谁可以做什么的决定是基于更细粒度的权限,或者基于管理员或用户需要能够在运行时更改的信息,那么您将不得不变得更有想象力。一种常用的、通用的、灵活的方法称为Role-Based Access Control (也称为RBAC)。
这可能会变得非常复杂,但应用到您的案例中的核心概念是,您有一个用户、实体(组)和一个操作(加入)。您需要确定是否允许用户1使用组2作为参数执行名为“join”的操作。
为了做到这一点,您必须在某个地方保留一组规则,然后做两件事:
当向系统中添加新用户和组时,或者当管理员在每次请求时更改其permissions
我不会深入这个用例的低级细节。可以这么说,如果您今天要完成的任务最终需要成长为一个相当复杂的权限系统,那么您最好研究一下RBAC。
发布于 2012-08-18 05:27:37
向表users添加一个额外的字段: is_allowed_to_join_2 int(1)
当用户登录时,设置
$_SESSION['is_allowed_to_join_2'] = $user['is_allowed_to_join_2'] == 1 ? true : false;在ajax调用中,在您的php代码中:
if( $_SESSION['is_allowed_to_join_2'] !== true )
{
exit("Not allowed");
}发布于 2012-08-18 05:26:51
如何验证/授权用户可以通过AJAX请求数据。
与对任何其他HTTP请求进行身份验证/授权的方式相同。
,或者现在我正在使用会话进行身份验证。
会话是跟踪用户是否登录以及他们以谁的身份登录的一种明智方式。
如何检查此用户是否真的被允许加入group_id=2?
会话数据告诉您用户是谁。
最重要的是,你实现你的业务逻辑来确定他们是否被允许加入第二组。我们不能告诉你那是什么,因为我们不知道业务逻辑是什么。
例如,如果只允许区域2国家的用户加入组2,那么您的逻辑可能是这样的:
IF session exists
AND user is logged in
AND user's country is in region 2
THEN authorized确定用户所在的国家是否在区域2中可能需要使用一些SQL语句,例如
SELECT user_id FROM members, countries WHERE user=:username AND members.country=countries.id AND countries.region=:regionhttps://stackoverflow.com/questions/12013345
复制相似问题