我正在构建一个用户可以相互分配任务的Web应用程序。
用户都在局域网上。
已经有一个基本权限系统,其中用户角色是管理员或普通用户。
我必须实现的是非常细粒度的东西......我想不出一个很好的方法来做到这一点
下面列出了我需要控制的事项:
我想要的是一个类似的例子,以便我不必重新发明轮子。或者也许是关于如何以尽可能少的头痛实现这一点的想法:P。此外,我不知道如何构建一个MySQL表来存储所有这些权限。
我想过分配用户角色,但我需要比这些角色更多的灵活性。
有什么想法吗?
答案 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_id
和target_user_id
列的表,您可以在其中插入用户可以分配任务的user_id
。或者,您可以像上面的通用ID一样向上表添加另一列,然后插入ASSIGN_TASK
并使用目标用户填充ID列。
答案 2 :(得分:0)
允许管理员定义角色,并定义赋予每个角色的权力。这可以通过逐位比较(好)或多对多关系数据库表(更好)来完成。
该系统为您提供了最大的灵活性,因为它可以轻松地添加新功能,而无需重新配置整个角色系统。