最佳实践:如何在服务器上验证/授权AJAX调用

时间:2012-08-17 21:21:59

标签: javascript php ajax authorization jcryption

最后几天我想知道它是如何完成的?如何验证/授权用户可以通过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.

提前致谢!

3 个答案:

答案 0 :(得分: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");
}

答案 1 :(得分:1)

  

如何验证/授权用户可以通过AJAX请求数据。

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

  

或者现在我正在使用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

答案 2 :(得分:1)

我相信你的问题是关于授权,而不是身份验证。如果我是对的,那么大概你已经知道用户(身份验证,可能使用cookie或其他东西)。

现在,你必须想出一种方法来确定他们可以做什么(授权)。

授权逻辑确实是一个关键的设计决策。因此,它非常重要,并且在很大程度上取决于数据模型的形状和应用程序的体系结构。

如果您可以通过对数据应用规则来持续确定是否允许这样做,例如在Quentin上面的响应中(生活在区域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添加一个功能,该功能委派给这个新的用户功能:

function addUser($user) {
    $user->joinGroup($this);
}

OTOH,如果关于谁可以做什么基于更细粒度的权限,或者基于管理员或用户需要能够在运行时更改的信息的决定,那么你将不得不获得更多的发现。一种常用的,通用的,灵活的方法称为Role-Based Access Control(又称RBAC)。

这可能会非常复杂,但适用于您的案例的核心概念是您拥有用户,实体(组)和操作(加入)。您需要确定是否允许用户1以组2作为参数执行名为“join”的操作。

为了做到这一点,你必须在某处保留一套规则,然后做两件事:

  1. 将新用户和组添加到系统或管理员更改其权限时,使这些表保持最新状态
  2. 使用每个请求检查这些表,以查看用户是否可以对实体执行操作(检查用户是否可以加入
  3. 我不会深入了解此用例的低级细节。我只想说,如果你今天要完成的任务最终需要发展成一个相当复杂的权限系统,那么你最好先研究一下RBAC。