用户权限精细控制PHP MySQL

时间:2012-03-14 07:41:13

标签: php jquery mysql

我正在构建一个用户可以相互分配任务的Web应用程序。

用户都在局域网上。

已经有一个基本权限系统,其中用户角色是管理员或普通用户。

我必须实现的是非常细粒度的东西......我想不出一个很好的方法来做到这一点

下面列出了我需要控制的事项:

  1. 如果用户可以更改其他用户信息
  2. 如果用户可以通过VPN访问LAN网络(这是另一个挑战,我认为)
  3. 用户只能将任务分配给一组其他用户(可能全部,可能很少)
  4. 如果用户能够从其他用户更改/删除已分配的任务
  5. 如果用户可以删除其他用户
  6. 如果用户可以更改其他用户权限
  7. 我想要的是一个类似的例子,以便我不必重新发明轮子。或者也许是关于如何以尽可能少的头痛实现这一点的想法:P。此外,我不知道如何构建一个MySQL表来存储所有这些权限。

    我想过分配用户角色,但我需要比这些角色更多的灵活性。

    有什么想法吗?

3 个答案:

答案 0 :(得分:0)

一种简单的方法是在用户表中只有一个额外的列,称为Access,Permission或类似的东西。然后,对于您希望的每个权限,您可以使用可分为2的整数值或数字1来定义常量,例如:

class PermissionChecker {
  const CAN_CHANGE_OTHER_USERS_INFO = 1; // in bit form: 000001
  const CAN_ACCESS_LAN_VIA_VPN = 2;      //              000010
  const CAN_ASSIGN_TASKS = 4;            //              000100 
  const CAN_CHANGE_OTHER_USERS_TASKS = 8;//              001000
  const CAN_DELETE_USERS = 16;           //              010000
  const CAN_CHANGE_USER_PERMISSIONS = 32;//              100000

  public static function hasAccess($userAccess, $accessFlag) {
    return $userAccess & $accessFlag; // The bitwise operation is the key....
  }
}

$userAccess = 33; // read from database, in bit form: 100001

// check permissions like:

if (PermissionChecker::hasAccess($userAccess, PermissionChecker::CAN_CHANGE_OTHER_USERS_INFO)) {
  // this will be true, because 100001 & 000001 returns 1
}
if (PermissionChecker::hasAccess($userAccess, PermissionChecker::CAN_CHANGE_USER_PERMISSIONS)) {
  // this will be true as well, because 100001 & 100000 returns 1
}
if (PermissionChecker::hasAccess($userAccess, PermissionChecker::CAN_CHANGE_OTHER_USERS_TASKS)) {
  // this will not happen... because 100001 & 001000 returns 0
}

然后,当需要另一个权限级别时,您只需添加另一个可分为2的数字,例如64,128等。也许不是最漂亮的解决方案,而是一个简单的解决方案。

当您想要为用户存储权限时,您可以使用按位或运算符,例如:

$userAccess = PermissionChecker::CAN_CHANGE_OTHER_USERS_TASKS |
              PermissionChecker::CAN_CHANGE_OTHER_USERS_INFO; // will give $userAccess = 9;
// then store $userAccess in the database for current user...

答案 1 :(得分:0)

一种选择是使用数据库表来存储行是单个权限的权限。如果表中没有给定user_id的权限,则该用户没有该权限。

user_id | permission
-----------------------------
   1    | CHANGE_USER_INFO
   1    | DELETE_USERS
   1    | CHANGE_USER_PERMISSIONS
   2    | VPN_ACCESS

如您所见,用户1可以更改信息,删除和更改权限。用户2只能访问VPN。这很容易添加和删除权限,您只需要插入或删除即可。将来创建新的权限类型也很容易。

解决你的第3点问题。那会更复杂。为此,您可以使用另一个包含user_idtarget_user_id列的表,您可以在其中插入用户可以分配任务的user_id。或者,您可以像上面的通用ID一样向上表添加另一列,然后插入ASSIGN_TASK并使用目标用户填充ID列。

答案 2 :(得分:0)

允许管理员定义角色,并定义赋予每个角色的权力。这可以通过逐位比较(好)或多对多关系数据库表(更好)来完成。

该系统为您提供了最大的灵活性,因为它可以轻松地添加新功能,而无需重新配置整个角色系统。