用户组及其管理站点的权限

时间:2010-10-09 18:29:12

标签: php usergroups

根据用户群为用户授予某些操作/权限的最佳方法是什么?假设有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文件中,然后包含在页面中。这是一个好主意还是有更好的解决方案?

3 个答案:

答案 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');

和上面的方法一样,在调用动作之前通过函数检查权限