1

最后几天我想知道它是如何完成的?您如何验证/授权允许用户通过 AJAX 请求数据。

现在我使用 SESSIONS 进行身份验证。但这只是一个次要的保护。

假设我有一些名为 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。

提前致谢!

4

3 回答 3

2

向表用户添加一个额外的字段: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-17T21:27:36.540 回答
1

我相信您的问题是关于授权,而不是身份验证。如果我是对的,那么大概您已经知道用户是(身份验证,可能使用 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 作为参数执行名为“加入”的操作。

为此,您必须在某处保留一组规则,然后做两件事:

  1. 将新用户和组添加到系统或管理员更改其权限时,使这些表保持最新
  2. 检查每个请求的这些表以查看用户是否可以对实体执行操作(检查用户是否可以加入

我不会深入探讨这个用例的底层细节。可以这么说,如果您今天要完成的工作最终需要发展成一个相当复杂的权限系统,那么您最好学习一下 RBAC。

于 2012-08-17T21:55:40.677 回答
1

您如何验证/授权允许用户通过 AJAX 请求数据。

与您对任何其他 HTTP 请求进行 auth/authz 相同的方式。

或者现在我正在使用 SESSIONS 进行身份验证。

会话是跟踪用户是否登录以及他们以谁身份登录的明智方式。

如何检查该用户是否真的被允许加入 group_id=2?

会话数据告诉您用户是谁。

最重要的是,您实现业务逻辑以确定是否允许他们加入组 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=:region
于 2012-08-17T21:26:51.257 回答