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

Php 用户组及其管理站点的权限,php,usergroups,Php,Usergroups,根据用户组向用户授予某些操作/权限的最佳方式是什么?假设有3个组-用户、管理员和会计。用户可以执行操作1、管理操作1、2、3、会计操作1和2。可能是这样的: if(group == user){ action1(); //function } if(group == admin){ action1(); action2(); action3(); } if(group == accountant){ action1(); action2(); } if ( has_permission('ac

根据用户组向用户授予某些操作/权限的最佳方式是什么?假设有3个组-用户、管理员和会计。用户可以执行操作1、管理操作1、2、3、会计操作1和2。可能是这样的:

if(group == user){ action1(); //function }
if(group == admin){ action1(); action2(); action3(); }
if(group == accountant){ action1(); action2(); }
if ( has_permission('action_one') ) {
    action_one();
}
$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');

所有操作都将存储在functions.php文件中,然后包含在页面中。这是一个好主意还是有更好的解决方案?

一个用户可以加入多个组吗?如果没有,请在数据库中创建一个表:

Group
group_id   INT (for sorting)
group_name VARCHAR
user_id    INT
否则,创建表组|组| id、组|名称和表组|用户|隶属关系|组| id、用户| id

显然,要根据您的命名方案调整这些

如果您已经有了一个用户类的OOP方法,那么添加一个field.group。
否则,创建诸如字符串get\u groupINT$user\u id之类的函数,然后查询数据库。

一个用户可以是多个组的一部分吗?如果没有,请在数据库中创建一个表:

Group
group_id   INT (for sorting)
group_name VARCHAR
user_id    INT
否则,创建表组|组| id、组|名称和表组|用户|隶属关系|组| id、用户| id

显然,要根据您的命名方案调整这些

如果您已经有了一个用户类的OOP方法,那么添加一个field.group。
否则,创建诸如字符串get\u groupINT$user\u id之类的函数,然后使用诸如

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
因为版主和会计的权限在同一级别

到目前为止,最好的解决方案是使用位运算符并将二进制值分配给受保护的区域

举一个简单的例子,用户可以阅读内容,版主可以读写内容,管理员可以读写删除内容。下表中的值是使用按位or运算符构造的

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。对于write函数

User         Permission
User            Write
1        &        2
0b001    &      0b010 -- returns false
Admin           Write
7        &        2
0b111    &      0b010 -- returns true
在第一个示例中,0b001不包含位0b010,因此返回false。0b111不包含位0b010并返回true


使用比较器阅读更多信息,如

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
因为版主和会计的权限在同一级别

到目前为止,最好的解决方案是使用位运算符并将二进制值分配给受保护的区域

举一个简单的例子,用户可以阅读内容,版主可以读写内容,管理员可以读写删除内容。下表中的值是使用按位or运算符构造的

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。对于write函数

User         Permission
User            Write
1        &        2
0b001    &      0b010 -- returns false
Admin           Write
7        &        2
0b111    &      0b010 -- returns true
在第一个示例中,0b001不包含位0b010,因此返回false。0b111不包含位0b010并返回true


阅读更多

我会在数据库中创建另外两个表,比如权限,只包含两个字段——id和名称,可能还有一个标题供人阅读。 第二个是组权限。然后只需添加一些权限,例如:“操作一”、“操作二”和“另一个操作”

然后在php中检查如下权限:

if(group == user){ action1(); //function }
if(group == admin){ action1(); action2(); action3(); }
if(group == accountant){ action1(); action2(); }
if ( has_permission('action_one') ) {
    action_one();
}
$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');
对于一个只有3个组的任务来说,这种方法可能会有一点开销,但是如果以后添加更多的组,它将被证明是有用的

或者,我知道一种硬编码方法,您可以在其中创建配置文件并列出如下权限:

if(group == user){ action1(); //function }
if(group == admin){ action1(); action2(); action3(); }
if(group == accountant){ action1(); action2(); }
if ( has_permission('action_one') ) {
    action_one();
}
$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');

和上面的方法一样,在调用一个操作之前,通过函数检查权限,我会在数据库中创建另外两个表,比如权限,只有两个字段——id和名称,可能还有一个标题供人阅读。 第二个是组权限。然后只需添加一些权限,例如:“操作一”、“操作二”和“另一个操作”

然后在php中检查如下权限:

if(group == user){ action1(); //function }
if(group == admin){ action1(); action2(); action3(); }
if(group == accountant){ action1(); action2(); }
if ( has_permission('action_one') ) {
    action_one();
}
$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');
对于一个只有3个组的任务来说,这种方法可能会有一点开销,但是如果以后添加更多的组,它将被证明是有用的

或者,我知道一种硬编码方法,您可以在其中创建配置文件并列出如下权限:

if(group == user){ action1(); //function }
if(group == admin){ action1(); action2(); action3(); }
if(group == accountant){ action1(); action2(); }
if ( has_permission('action_one') ) {
    action_one();
}
$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');
和方法abov一样
e在调用操作之前通过函数检查权限

遗憾的是,您没有将Perl与Catalyst结合使用,因为基于角色的授权看起来很棒。不过,它可能会给您一些启示:遗憾的是,您没有将Perl与Catalyst结合使用,因为基于角色的授权看起来很棒。不过,它可能会给你一些灵感: