用户权限管理的最佳模式

optimal schema for user permission management

所以我有一些硬编码权限。 Class "A" 用户可以创建角色并定义每个模块的访问级别。当用户尝试访问资源系统时,检查用户是否应该能够读取资源以及是否应该显示 'edit' 控件。

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

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

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')?

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

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

您甚至可以将所有用户的权限存储在其 table 的 ONE 字段中。 users.permissions 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']}" //在"Admin"

附近

例如,您可以针对用户的进度授予用户一些特定权限(如 Whosebug 上的此处)。

等等。非常灵活。

抱歉是英语,"pseudo-code" 与 Laravel 几乎没有关系,只是如何组织权限系统的变体。 如果您有兴趣,稍后我会在 Laravel 中给出一些关于此的建议。