所以我有一些硬编码的持久性。 “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')
?
答案 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 字段中。
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']}"
// somth near" Admin"
例如,您可以为用户提供一些具有进度的特定权限(如此处在StackOverflow上)。
等等。非常灵活。
对不起英语,"伪代码"与Laravel几乎没有关系,只是变体如何组织权限系统。 如果您有兴趣,我会在Laravel中提出一些建议。