跳至内容

授权

授权在用户通过认证被识别后发生。它是确定用户在您的网站中被允许执行哪些操作的过程。

Shield 提供了一个灵活的基于角色的访问控制 (RBAC),允许用户同时属于多个组。组可以被认为是传统角色(管理员、版主、用户等),但也可以将人员分组到功能中,例如 Beta 功能访问,或用于在论坛中提供离散的用户组等。

定义可用组

组在 Shield\Config\AuthGroups 配置类中定义。

public array $groups = [
    'superadmin' => [
        'title'       => 'Super Admin',
        'description' => 'Optional description of the group.',
    ],
];

$groups 数组的键是组的通用术语。这是您在其他地方引用组时要调用的内容,例如检查 $user->inGroup('superadmin')。默认情况下,以下组可用:superadminadmindeveloperuserbeta

默认用户组

当用户首次在网站上注册时,他们会被分配到一个默认用户组。此组在 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() 方法。

通过路由授权

您可以通过 控制器过滤器 限制对路由或路由组的访问。

提供了一个用于通过用户所属组进行限制,另一个用于他们需要的权限。这些过滤器分别以 grouppermission 别名自动注册到系统中。

您可以在 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();