权限允许用户在后端面板中拥有特定权限和功能。一个例子可能是创建或删除记录的能力,或查看服务器日志。这些权限基于分配的角色,并且可以按用户授予。
权限代码定义一个单独的权限,并且是使用“点”表示法的字符串键,例如,some.area.permission_name。 这些权限通过直接分配或通过其角色继承授予用户。
当检查用户是否具有特定权限时,该用户角色的权限会被继承,然后被直接应用于该用户的任何权限覆盖。例如:
eat_cake 权限;但是eat_cake 权限 被明确设置为拒绝;那么eat_cake。但是:
eat_vegetables 直接分配给他,但是;eat_vegetables。权限代码支持嵌套结构,以便在选择权限时提供更简洁的界面。要嵌套权限代码,“点”值必须是其父级的直接后代,并且支持无限嵌套。
在以下示例中,manage_entries 权限必须被授予,以便 manage_entries.create 和 manage_entries.publish 代码可用。视觉上它表示如下:
├── 管理条目
| ├── 管理条目.创建
| └── 管理条目.发布
└── 删除条目
对 October CMS 实例所有部分的访问由权限系统控制。BackendAuth::userHasAccess 方法是一种快速检查当前用户是否已登录并拥有特定区域权限的方式。
// Returns true if the user has permission
$permissionGranted = BackendAuth::userHasAccess('utilities.logs');管理员可以被授予一个特殊标志 称为 "超级用户" 允许访问所有区域. 当被授予时, 权限系统被绕过 从而可以访问所有区域. 超级用户 对 其他普通管理员 不可见.
任何超级用户都可以创建和删除其他超级用户,因此,它应该只授予应用程序的最高级别管理员或所有者。
角色使用 Backend\Models\UserRole 模型,并且是权限的分组,具有名称和描述,用于标识角色。 管理员一次只能被分配一个角色。
October CMS 内置两种默认系统角色 名为 developer 和 publisher。任意数量的具有各自权限组合的自定义角色可以创建并应用于用户。
系统角色无法更改其权限,但是如果不需要,它们可以被删除。
每个角色在后端面板中都被分配一个排序位置,在数据库中表示为 sort_order 列。这允许建立一个基本的组织结构,其中用户只能管理低于他们自己角色的角色。
在以下示例中,高级编辑可以管理所有用户,其权限高于撰稿人和事实核查员角色。然而,事实核查员角色无法查看用户或管理其上级权限,即撰稿人和高级编辑角色中的权限。
如果获得 管理管理员 → 管理角色 权限,用户可以管理他们自己的 用户, 权限 and 角色 存在于其当前角色之下。
插件可以通过覆盖 插件注册文件 中的 registerPermissions 方法来注册后端用户权限. 权限被定义为一个数组,其中键对应权限键,值对应权限描述. 权限键由作者名称、插件名称和功能名称组成. 下面是一个示例代码.
acme.blog.access_categories
下一个示例展示了如何注册后端权限项。权限由权限键和描述定义。在后端权限管理用户界面中,权限以复选框列表的形式显示。后端控制器可以使用插件定义的权限来限制用户访问页面或功能。
public function registerPermissions()
{
return [
'acme.blog.access_posts' => [
'label' => 'Manage the blog posts',
'tab' => 'Blog',
'order' => 200,
],
// ...
];
}您也可以指定一个 roles 选项,它是一个数组,每个值都是一个角色 API 代码。当使用此代码创建角色时,它就成为一个系统角色,始终将此权限授予拥有该角色的用户。
public function registerPermissions()
{
return [
'acme.blog.access_categories' => [
'label' => 'Manage the blog categories',
'tab' => 'Blog',
'order' => 200,
'roles' => ['developer']
]
// ...
];
}在后端控制器类中,你可以指定访问该控制器提供的页面所需的权限。这是通过控制器的$requiredPermissions属性完成的。此属性应该包含一个权限键数组。如果用户权限与列表中的任何权限匹配,框架将允许用户查看控制器页面。
namespace Acme\Blog\Controllers;
use Backend\Classes\BackendController;
class Posts extends BackendController
{
public $requiredPermissions = ['acme.blog.access_posts'];
}您还可以使用星号符号来指示“所有权限”条件。在下一个示例中,控制器页面可供所有拥有任何以“acme.blog.”字符串开头的权限的用户访问:
public $requiredPermissions = ['acme.blog.*'];后端用户模型具有允许确定用户是否具有特定权限的方法。您可以使用此功能来限制后端用户界面的功能。后端用户支持的权限方法是 userHasAccess 和 userHasPermission。这两种方法都接受两个参数:权限键字符串(或键字符串数组)和一个可选参数,指示第一个参数中列出的所有权限都是必需的。
userHasAccess 方法返回 **true** 对于任何权限,如果用户是超级用户。 userHasPermission 方法更严格,仅在用户确实在其账户中或通过其角色拥有指定的权限时才返回 true。通常,userHasAccess 是首选方法,因为它尊重超级用户的绝对权力。以下示例展示了如何在控制器代码中使用这些方法。
if (BackendAuth::userHasAccess('acme.blog.*')) {
// ...
}
if (BackendAuth::userHasPermission([
'acme.blog.access_posts',
'acme.blog.access_categories'
])) {
// ...
}您还可以使用后端视图中的方法来隐藏用户界面元素。下一个示例演示了如何在后端表单上隐藏一个按钮。
<?php if (BackendAuth::userHasAccess('acme.blog.delete_categories')): ?>
<button
type="button"
class="oc-icon-trash-o btn-icon danger"
data-request="onDelete"
data-load-indicator="Deleting Category..."
data-request-confirm="Do you really want to delete this category?">
</button>
<?php endif ?>