根据用户群为用户授予某些操作/权限的最佳方法是什么?假设有3个组 - 用户,管理员和会计师。用户可以执行action1,admin - action1,2,3,accountant - action1和2.可能是这样的:
if(group == user){ action1(); //function }
if(group == admin){ action1(); action2(); action3(); }
if(group == accountant){ action1(); action2(); }
所有操作都将存储在functions.php文件中,然后包含在页面中。这是一个好主意还是有更好的解决方案?
答案 0 :(得分:3)
使用比较器,如
if (admin) {do x}
else if (user) {do y}
这是一个坏主意,因为它不灵活且不能很好地扩展。
有几个选择。如果您的权限是分层的,则意味着一个用户可以执行所有操作,而较低的用户拥有的权限少于上述用户的权限,例如
admin - 1, 2, 3
accountant - 1, 2
user - 1
然后你可以给他们数字然后说
if (permissionValue => 500)
{
action2();
}
并有一张桌子:
admin 1000
accountant 500
user 250
这允许您在管理员和会计师之间添加新的用户类型(比如主持人),但如果您有以下内容则无法使用:
admin 1, 2, 3
accountant 1, 2
moderator 1, 3
user 1
由于主持人和会计师的权限处于同一级别。
到目前为止,最好的解决方案是使用按位运算符并将二进制值分配给受保护区域。
举一个简单的例子,用户可以阅读内容,主持人可以读写内容,管理员可以阅读,写入和删除内容。您将拥有下表(值使用按位或运算符构造)
Users: Read Write Delete
admin: 7 - (0b001 | 0b010 | 0b100) = 0b111 = 7
moderator: 3 - (0b001 | 0b010 | NO ) = 0b011 = 3
user: 1 - (0b001 | NO | NO ) = 0b001 = 1
然后你可以这样做:
//Permissions:
define('READ', 1);
define('WRITE', 2);
define('DELETE', 4);
if ($userPermissions & READ)
{
//Allowed to Read
}
if ($userPermissions & WRITE)
{
//Show write form
}
这些是按位运算符的示例。这意味着如果x包含位y返回true。对于写函数
User Permission
User Write
1 & 2
0b001 & 0b010 -- returns false
Admin Write
7 & 2
0b111 & 0b010 -- returns true
在第一个示例中,0b001不包含位0b010,因此返回false。 0b111确实包含位0b010并返回true。
了解更多Here
答案 1 :(得分:1)
用户是否可以加入多个群组?如果没有,请在数据库中创建一个表:
Group
group_id INT (for sorting)
group_name VARCHAR
user_id INT
否则,请制作表格Group | group_id, group_name
和表格Group_User_affiliation | group_id, user_id
显然要根据你的命名方案进行调整。
如果您已经采用OOP方法(User
类),则添加字段.group
。
否则,创建STRING get_group(INT $user_id)
等函数,然后查询数据库。
答案 2 :(得分:0)
我在数据库中另外制作了两个表,比如说permissions
只有2个字段 - id和name,也许还有1个以上 - title(用于人类阅读)。
第二个 - groups_permissions
。然后只需添加一些权限,例如:'action_one','action_two','and_another_action'
然后在php本身检查这样的权限:
if ( has_permission('action_one') ) {
action_one();
}
这个方法对于只有3个组的任务来说可能只是一点开销,但如果以后添加了更多的组,这个方法证明是有用的。
或者,我知道一种硬编码方法,您可以在其中创建配置文件并列出如下权限:
$permissions['admin'] = array('create_all', 'delete_all', 'update_all', 'ban_users', 'etc.');
$permissions['moderator'] = array('update', 'delete');
$permissions['user'] = array('view_members_area', 'create_post', 'update_own', 'etc');
和上面的方法一样,在调用动作之前通过函数检查权限