后端用户和权限
后端的用户管理包括角色、组、权限、密码重置和登录限制等功能。插件还可以注册权限来控制对后端功能的访问。
用户和权限
对 Winter CMS 实例所有部分的访问由权限系统控制。在最低级别,有超级用户(具有is_superuser
标志设置为真),管理员(用户)和权限。这\Backend\Models\User
模型是包含有关用户的所有重要信息的容器。
超级用户可以访问系统中的所有内容,并且只能由自己或其他超级用户管理;它们对普通管理员不可见或不可编辑,即使管理员拥有backend.manage_users
允许。
权限是以下形式的字符串键author.plugin.permission_name
通过在用户的“编辑管理员”页面上直接分配或通过用户角色继承授予用户的权限。
在检查用户是否具有特定权限时,该用户角色的权限设置将被继承,然后被直接应用于该用户的任何权限覆盖。例如,如果用户Bob 有作用Genius, 和角色Genius 有eat_cake
允许,但是Bob 有eat_cake
权限专门设置为拒绝然后Bob 不会到达eat_cake
.然而,如果Bob 有权限eat_vegetables
直接分配给他,但是Genius 角色没有,那么Bob 仍然可以eat_vegetables
.
角色 (\Backend\Models\UserRole
) 是权限分组,具有用于标识角色的名称和描述。管理员一次只能分配一个角色。一个角色可以分配给多个管理员。默认情况下,Winter 附带两个系统角色,developer
和publisher
.可以创建任意数量的具有自己的权限组合的自定义角色并将其应用于用户。
NOTE: 任何用户
manage_users
permissions 可以管理角色的分配,但只能分配给其他用户(不能分配给他们自己),并且角色只能由超级用户创建或修改。
NOTE: 系统角色 (
developer
,publisher
,以及任何角色is_system
设置true
) 不能通过后端更改其权限。假定他们有权访问所有权限,除非给定权限指定了一个或多个特定角色,该角色适用于使用roles
权限定义中的数组键(在这种情况下,只有指定的系统角色才能访问它)。
团体(\Backend\Models\UserGroup
) 是对管理员进行分组的组织工具,它们可以被认为是“用户类别”。它们与权限无关,仅用于组织目的。例如,如果您想向组中的所有用户发送电子邮件Head Office Staff
,你会简单地做Mail::sendTo(UserGroup::where('code', 'head-office-staff')->get()->users, 'author.plugin::mail.important_notification', $data);
后端用户助手
全球的BackendAuth
facade 可用于管理管理用户,它主要继承了Winter\Storm\Auth\Manager
班级。要注册新的管理员用户帐户,请使用BackendAuth::register
方法。
$user = BackendAuth::register([
'first_name' => 'Some',
'last_name' => 'User',
'login' => 'someuser',
'email' => 'some@website.tld',
'password' => 'changeme',
'password_confirmation' => 'changeme'
]);
这BackendAuth::check
方法是检查用户是否已登录的快速方法。要返回已登录的用户模型,请使用BackendAuth::getUser
反而。此外,活跃用户将作为$this->user
在任何里面后端控制器.
// Returns true if signed in.
$loggedIn = BackendAuth::check();
// Returns the signed in user
$user = BackendAuth::getUser();
// Returns the signed in user from a controller
$user = $this->user;
您可以使用登录名查找用户BackendAuth::findUserByLogin
方法。
$user = BackendAuth::findUserByLogin('someuser');
您可以通过提供用户的登录名和密码来验证用户BackendAuth::authenticate
.您还可以简单地通过传递Backend\Models\User
模型连同BackendAuth::login
.
// Authenticate user by credentials
$user = BackendAuth::authenticate([
'login' => post('login'),
'password' => post('password')
]);
// Sign in as a specific user
BackendAuth::login($user);
注册权限
插件可以通过覆盖registerPermissions
里面的方法插件注册类.权限被定义为一个数组,其中的键对应于权限键,值对应于权限描述。权限密钥由作者姓名、插件名称和功能名称组成。这是一个示例代码:
acme.blog.access_categories
下一个示例显示如何注册后端权限项。权限是使用权限键和描述定义的。在后端权限管理用户界面中,权限显示为复选框列表。后端控制器可以使用插件定义的权限来限制用户访问pages或者features.
public function registerPermissions()
{
return [
'acme.blog.access_posts' => [
'label' => 'Manage the blog posts',
'tab' => 'Blog',
'order' => 200,
'roles' => [\Backend\Models\UserRole::CODE_DEVELOPER, \Backend\Models\UserRole::CODE_PUBLISHER],
],
// ...
];
}
当开发一个将被更多项目使用的插件时,不仅仅是你自己的(即发布在市场上),强烈建议你填充roles
财产与\Backend\Models\UserRole::CODE_DEVELOPER
或者\Backend\Models\UserRole::CODE_PUBLISHER
或两者都取决于您希望具有这些默认系统提供的角色的用户拥有您的插件权限的访问级别。
您还可以提供 API 代码 ($role->code
) 的非默认角色,但请注意,这样做会自动将该角色转换为“系统”角色,这意味着只有在代码中明确注册到它的权限才会附加到它。系统角色不能通过后端接口或在数据库中编辑其权限。避免将您的权限附加到非默认系统角色(即CODE_DEVELOPER
&CODE_PUBLISHER
) 如果您将在市场上发布该插件或以其他方式使其可用于其他可能未定义您的自定义角色的项目(除非您的插件本身通过迁移过程中运行的播种程序提供所述自定义角色)。
NOTE: 如果
roles
如果不提供该属性,则默认情况下唯一有权访问该权限的用户将是超级用户或具有\Backend\Models\UserRole::CODE_DEVELOPER
继承所有“孤立权限”(未指定任何角色的权限)的角色。
限制对后端页面的访问
在后端控制器类中,您可以指定访问控制器提供的页面所需的权限。它完成了$requiredPermissions
控制器的属性。此属性应包含一组权限键。如果用户权限与列表中的任何权限匹配,框架将允许用户查看控制器页面。
<?php namespace Acme\Blog\Controllers;
use Backend\Classes\BackendController;
class Posts extends BackendController
{
public $requiredPermissions = ['acme.blog.access_posts'];
}
您还可以使用星号 符号表示“所有权限”条件。在下一个示例中,具有以“acme.blog”开头的任何权限的所有用户都可以访问控制器页面。细绳:
public $requiredPermissions = ['acme.blog.*'];
限制对功能的访问
后端用户模型具有允许确定用户是否具有特定权限的方法。您可以使用此功能来限制后端用户界面的功能。后台用户支持的权限方式有hasAccess
和hasPermission
.这两种方法都有两个参数:权限密钥字符串(或密钥字符串数组)和一个可选参数,该参数指示需要使用第一个参数列出的所有权限。
这hasAccess
方法返回true 对于任何权限,如果用户是超级用户(is_superuser
设置true
).这hasPermission
方法更严格,仅当用户在其帐户中或通过其角色实际拥有指定权限时才返回 true。一般来说,hasAccess
是首选方法,因为它尊重超级用户的绝对权力。以下示例显示了如何使用控制器代码中的方法:
if ($this->user->hasAccess('acme.blog.*')) {
// ...
}
if ($this->user->hasPermission([
'acme.blog.access_posts',
'acme.blog.access_categories'
])) {
// ...
}
您还可以使用后端视图中的方法来隐藏用户界面元素。下一个示例演示如何隐藏编辑类别上的按钮后端表单:
<?php if ($this->user->hasAccess('acme.blog.delete_categories')): ?>
<button
type="button"
class=wn-icon-trash-o btn-icon danger pull-right"
data-request="onDelete"
data-load-indicator="Deleting Category..."
data-request-confirm="Do you really want to delete this category?">
</button>
<?php endif ?>