用户权限管理的最佳模式
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 中给出一些关于此的建议。
所以我有一些硬编码权限。 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 中给出一些关于此的建议。