权限允许用户在后端面板中拥有特定的特权和功能。一个例子可能是创建或删除记录,或查看服务器日志的能力。这些权限基于分配的角色,并且可以基于每个用户授予。
权限代码定义单个权限并且是使用“点”表示法的字符串键,例如,some.area.permission_name。这些权限通过直接分配或通过其角色继承授予用户。
当检查用户是否拥有特定权限时,该用户角色的权限会被继承,然后被直接应用于该用户的任何权限覆盖。例如:
吃蛋糕 权限;但eat_cake 权限 明确设置为拒绝; 然后eat_cake。然而:
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 列。这使得可以建立一个基本的组织结构,在该结构中,用户只能管理低于其自身角色的角色。
在以下示例中,高级编辑可以管理所有用户,其权限高于撰稿人和事实核查员角色。而事实核查员角色无法查看用户或管理其上级权限,即撰稿人和高级编辑角色中的权限。
如果被授予了 管理管理员 → 管理角色 权限,用户可以管理其当前角色层级之下的用户、权限和角色。
插件可以通过覆盖 插件注册文件 中的 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 ?>