授权
授权在用户通过认证被识别后发生。它是确定用户在您的网站中被允许执行哪些操作的过程。
Shield 提供了一个灵活的基于角色的访问控制 (RBAC),允许用户同时属于多个组。组可以被认为是传统角色(管理员、版主、用户等),但也可以将人员分组到功能中,例如 Beta 功能访问,或用于在论坛中提供离散的用户组等。
定义可用组
组在 Shield\Config\AuthGroups
配置类中定义。
public array $groups = [
'superadmin' => [
'title' => 'Super Admin',
'description' => 'Optional description of the group.',
],
];
$groups
数组的键是组的通用术语。这是您在其他地方引用组时要调用的内容,例如检查 $user->inGroup('superadmin')
。默认情况下,以下组可用:superadmin
、admin
、developer
、user
和 beta
。
默认用户组
当用户首次在网站上注册时,他们会被分配到一个默认用户组。此组在 Config\AuthGroups::$defaultGroup
中定义,并且必须与已定义组之一的名称相匹配。
public string $defaultGroup = 'user';
定义可用权限
所有权限也必须添加到 AuthGroups
配置文件中。权限只是一个由作用域和操作组成的字符串,例如 users.create
。作用域将是 users
,操作将是 create
。如果需要,每个权限都可以有一个描述,以便在 UI 中显示。
public array $permissions = [
'admin.access' => 'Can access the sites admin area',
'admin.settings' => 'Can access the main site settings',
'users.manage-admins' => 'Can manage other admins',
'users.create' => 'Can create new non-admin users',
'users.edit' => 'Can edit existing non-admin users',
'users.delete' => 'Can delete existing non-admin users',
'beta.access' => 'Can access beta-level features'
];
将权限分配给组
为了向组授予任何权限,它们必须在 AuthGroups
配置文件的 $matrix
属性下的组中分配权限。
注意
这定义了组级权限。
矩阵是一个关联数组,组名作为键,应用于该组的权限数组作为值。
public array $matrix = [
'admin' => [
'admin.access',
'users.create', 'users.edit', 'users.delete',
'beta.access'
],
];
您可以在作用域内使用通配符来允许该作用域内的所有操作,方法是在操作位置使用 *
。
public array $matrix = [
'superadmin' => ['admin.*', 'users.*', 'beta.*'],
];
授权用户
User
实体上的 Authorizable
特性提供了以下方法来授权您的用户。
can()
允许您检查用户是否被允许执行特定操作或组或操作。权限字符串应作为参数传递。返回布尔值 true
/false
。将首先检查用户的直接权限(用户级权限),然后针对所有用户的组权限(组级权限)进行检查,以确定是否允许他们。
if ($user->can('users.create')) {
//
}
// If multiple permissions are specified, true is returned if the user has any of them.
if ($user->can('users.create', 'users.edit')) {
//
}
inGroup()
检查用户是否属于传入的其中一个组。返回布尔值 true
/false
。
if (! $user->inGroup('superadmin', 'admin')) {
//
}
hasPermission()
检查用户是否直接对自己设置了权限。这将忽略他们所属的任何组。
if (! $user->hasPermission('users.create')) {
//
}
注意
此方法仅检查用户级权限,而不检查组级权限。如果您想检查用户是否可以执行某些操作,请改用 $user->can()
方法。
通过路由授权
您可以通过 控制器过滤器 限制对路由或路由组的访问。
提供了一个用于通过用户所属组进行限制,另一个用于他们需要的权限。这些过滤器分别以 group
和 permission
别名自动注册到系统中。
您可以在 app/Config/Routes.php 中设置过滤器
$routes->group('admin', ['filter' => 'group:admin,superadmin'], static function ($routes) {
$routes->group(
'',
['filter' => ['group:admin,superadmin', 'permission:users.manage']],
static function ($routes) {
$routes->resource('users');
}
);
});
请注意,传递给外部 group()
的选项 (filter
) 不会与内部 group()
选项合并。
注意
如果您为一个路由设置了多个过滤器,则需要启用 多个过滤器。
管理用户权限
权限既可以授予用户级别,也可以授予组级别。任何授予的用户级别权限将覆盖组,因此用户有可能执行其组无法执行的操作。
addPermission()
向用户添加一个或多个用户级别权限。如果权限不存在,则会抛出 CodeIgniter\Shield\Authorization\AuthorizationException
。
$user->addPermission('users.create', 'users.edit');
removePermission()
从用户中删除一个或多个用户级别权限。如果权限不存在,则会抛出 CodeIgniter\Shield\Authorization\AuthorizationException
。
$user->removePermission('users.delete');
syncPermissions()
将用户的用户级别权限更新为仅包含给定列表中的权限。该用户上不在此列表中的任何现有权限都将被删除。
$user->syncPermissions('admin.access', 'beta.access');
getPermissions()
返回此用户直接分配给他们的所有用户级别权限。
$user->getPermissions();
注意
此方法不返回组级别权限。
管理用户组
addGroup()
向用户添加一个或多个组。如果组不存在,则会抛出 CodeIgniter\Shield\Authorization\AuthorizationException
。
$user->addGroup('admin', 'beta');
removeGroup()
从用户中删除一个或多个组。如果组不存在,则会抛出 CodeIgniter\Shield\Authorization\AuthorizationException
。
$user->removeGroup('admin', 'beta');
syncGroups()
将用户的组更新为仅包含给定列表中的组。该用户上不在此列表中的任何现有组都将被删除。
$user->syncGroups('admin', 'beta');
getGroups()
返回此用户所属的所有组。
$user->getGroups();
用户激活
所有用户都有一个active
标志。仅当启用EmailActivation
操作或用于激活用户的自定义操作时才使用此标志。
检查激活状态
您可以使用isActivated()
方法来确定用户是否已激活。
if ($user->isActivated()) {
//
}
注意
如果在Auth
配置文件的actions['register']
属性中未指定激活器,则这将始终返回true
。
您可以通过isNotActivated()
方法检查用户是否尚未激活。
if ($user->isNotActivated()) {
//
}
激活用户
用户在EmailActivator
操作中自动激活。它们可以通过User
实体上的activate()
方法手动激活。
$user->activate();
停用用户
用户可以通过User
实体上的deactivate()
方法手动停用。
$user->deactivate();