用户权限管理的最佳模式

时间:2015-07-31 09:09:50

标签: laravel permissions schema

所以我有一些硬编码的持久性。 “A”类用户可以创建角色并为每个模块定义访问级别。当用户尝试访问资源系统时,检查用户是否应该能够读取资源以及是否应显示“编辑”控件。

我正在制作一个Laravel应用,所以我也会在自定义Route::filter中使用它。

我想到的是将$table->integer('resource_title')列添加到角色表,其中:

0 - no access to resource
1 - user level access (read and/or basic functionality)
2 - manage level access (define/edit/delete classifiactors and/or entities)

专业人士会做什么?这个?一些额外的支点或$table->boolean('resource_title_access_level')

1 个答案:

答案 0 :(得分:0)

对于mor灵活性,您不仅可以为资源定义访问权限,还可以对其上的某些操作定义访问权限。 尽可能多的角色。 例如,如果我们有论坛:

post
post_edit_own
post_edit
post_delete_own
post_delete
thread_create
thread_edit_own
thread_edit
thread_delete
category_create
category_edit
category_merge
category_delete

您甚至可以将所有用户的权限存储在其表格的 ONE 字段中。 userspermissions BIGINT

为此,您应该将此权限存储在某些配置中,例如" bitfields" (糟糕的英语)

$bf = [
    post_create => 1,
    post_edit_own => 2,
    post_edit => 4,
    post_delete_own => 8,
    post_delete => 16,
    thread_create => 32,
    thread_edit_own => 64,
    thread_edit => 128,
    thread_delete => 256,
    category_create => 512,
    category_edit => 1024,
    category_merge => 2048,
    category_delete => 4096,
]

之后,您可以通过以下方式计算任何所需的权限集:

function getPermsSet(array $permsToAdd = ['post_create', 'thread_create']) {
    $permSet = 0;
    foreach ($permsToAdd as $premission) {
        $permSet += $bf[$premission];   
    }
    return $permSet;
}

例如,如果您想更改用户权限。

"UPDATE users SET permissions = " . getPermSet([some permissions...]). " WHERE id = ?"

检查用户可访问性是否太容易:

function hasPermission($permission) {
    return  $this->permissions & $bf[$permission];
}

并像这样使用它:

if ($user->hasPermission('post_edit') OR 
    $user->hasPermission('post_edit_own') AND $post->author->id == $user->id
) {
    //do things related to post-edition
}

要获得某些权限的用户,您可以使用此

"SELECT * FROM users WHERE permissions & {$bf['category_delete']}" // somth near" Admin"

例如,您可以为用户提供一些具有进度的特定权限(如此处在StackOverflow上)。

等等。非常灵活。

对不起英语,"伪代码"与Laravel几乎没有关系,只是变体如何组织权限系统。 如果您有兴趣,我会在Laravel中提出一些建议。