1

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

4

3 回答 3

4

使用比较器,例如

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。

在这里阅读更多

于 2010-10-09T18:40:50.080 回答
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类),那么添加一个 field .group。否则,创建诸如 之类的函数STRING get_group(INT $user_id),然后查询数据库。

于 2010-10-09T18:40:36.417 回答
0

我会在数据库中创建另外两个表,比如permissions只有 2 个字段 - id 和 name,也许再加上 1 个 - 标题(供人类阅读)。而第二个—— 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');

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

于 2010-10-09T20:40:07.550 回答