跳至内容

使用授权

配置

更改可用组

可用的组在 app/Config/AuthGroups.php 配置文件中的 $groups 属性下定义。向数组中添加新条目或删除现有条目,以便在整个应用程序中使用它们。

public array $groups = [
    'superadmin' => [
        'title'       => 'Super Admin',
        'description' => 'Complete control of the site.',
    ],
    //
];

设置默认组

当用户在你的网站上注册时,他们将被分配 Config\AuthGroups::$defaultGroup 中指定的组。更改此项为 $groups 数组中的一个键以更新此项。

更改可用权限

网站上的权限也存储在 AuthGroups 配置文件中。每个权限由一个字符串定义,该字符串表示一个上下文和一个权限,并用小数点连接。

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',
];

为组分配权限

每个组都可以有自己特定的权限集。这些权限在 Config\AuthGroups::$matrix 中定义。你可以通过其全名或使用上下文和星号 (*) 来指定每个权限,以指定该上下文中的所有权限。

public array $matrix = [
    'superadmin' => [
        'admin.*',
        'users.*',
        'beta.access',
    ],
    //
];

为用户分配权限

权限也可以直接分配给用户,无论他们属于哪个组。这是在 User 实体上以编程方式完成的。

$user = auth()->user();

$user->addPermission('users.create', 'beta.access');

这将添加所有新权限。您还可以同步权限,以便用户仅拥有直接分配给他们的权限。未在提供列表中的任何权限都将从用户中移除。

$user = auth()->user();

$user->syncPermissions('users.create', 'beta.access');

检查用户是否拥有权限

当您需要检查用户是否拥有特定权限时,请对User实体使用can()方法。此方法检查他们所属组中的权限和直接分配给用户的权限。

if (! auth()->user()->can('users.create')) {
    return redirect()->back()->with('error', 'You do not have permissions to access that page.');
}

注意

如果要将上述示例应用于网站的多个页面,还可以通过控制器过滤器来完成。

向用户添加组

通过addGroup()方法将组分配给用户。您可以传入多个组,它们都将分配给用户。

$user = auth()->user();
$user->addGroup('admin', 'beta');

这将添加所有新组。您还可以同步组,以便用户仅属于直接分配给他们的组。未在提供列表中的任何组都将从用户中移除。

$user = auth()->user();
$user->syncGroups('admin', 'beta');

从用户中移除组

通过removeGroup()方法从用户中移除组。可以通过将所有组名传递到方法中来一次性移除多个组。

$user = auth()->user();
$user->removeGroup('admin', 'beta');

检查用户是否属于组

您可以使用inGroup()方法检查用户是否属于某个组。

$user = auth()->user();
if ($user->inGroup('admin')) {
    // do something
}

您可以向该方法传递多个组,如果用户属于任何指定组,它将返回true

$user = auth()->user();
if ($user->inGroup('admin', 'beta')) {
    // do something
}