wakjoko/laravel-permission

为Laravel 5.4及以上版本添加分组层处理权限

2.37.0 2019-04-09 12:45 UTC

README

赞助商

Latest Version on Packagist Build Status StyleCI Total Downloads

本包允许您在数据库中管理用户权限和角色。

安装后,您可以执行以下操作

// Adding permissions to a user
$user->givePermissionTo('edit articles');

// Adding permissions via a role
$user->assignRole('writer');

$role->givePermissionTo('edit articles');

如果您使用多个守卫,我们也为您提供了支持。每个守卫都将有自己的权限和角色集,可以分配给守卫的用户。请参阅readme中的使用多个守卫部分。

由于所有权限都将注册在Laravel的gate上,因此您可以使用Laravel的默认can函数检查用户是否有权限

$user->can('edit articles');

Spatie是一家位于比利时安特卫普的网页设计公司。您可以在我们的网站上找到所有开源项目的概述这里

安装

Laravel

本包可用于Laravel 5.4或更高版本。如果您正在使用Laravel的旧版本,请查看本包的v1分支

您可以通过Composer安装包

composer require spatie/laravel-permission

服务提供者将自动注册。或者,您可以在您的config/app.php文件中手动添加服务提供者

'providers' => [
    // ...
    Spatie\Permission\PermissionServiceProvider::class,
];

您可以使用以下命令发布迁移

php artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider" --tag="migrations"

如果您为User模型使用UUID或GUID,则可以更新create_permission_tables.php迁移,将$table->unsignedBigInteger($columnNames['model_morph_key'])替换为$table->uuid($columnNames['model_morph_key'])。为了保持一致性,您还可以更新包配置文件,使用model_uuid列名而不是默认的model_id列名。

迁移发布后,您可以通过运行迁移来创建角色和权限表

php artisan migrate

您可以使用以下命令发布配置文件

php artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider" --tag="config"

发布后,config/permission.php配置文件包含以下内容

return [

    'models' => [

        /*
         * When using the "HasPermissions" trait from this package, we need to know which
         * Eloquent model should be used to retrieve your permissions. Of course, it
         * is often just the "Permission" model but you may use whatever you like.
         *
         * The model you want to use as a Permission model needs to implement the
         * `Spatie\Permission\Contracts\Permission` contract.
         */

        'permission' => Spatie\Permission\Models\Permission::class,

        /*
         * When using the "HasRoles" trait from this package, we need to know which
         * Eloquent model should be used to retrieve your roles. Of course, it
         * is often just the "Role" model but you may use whatever you like.
         *
         * The model you want to use as a Role model needs to implement the
         * `Spatie\Permission\Contracts\Role` contract.
         */

        'role' => Spatie\Permission\Models\Role::class,
		
		'group' => Spatie\Permission\Models\Group::class,

    ],

    'table_names' => [

        /*
         * When using the "HasRoles" trait from this package, we need to know which
         * table should be used to retrieve your roles. We have chosen a basic
         * default value but you may easily change it to any table you like.
         */

        'roles' => 'roles',

        /*
         * When using the "HasPermissions" trait from this package, we need to know which
         * table should be used to retrieve your permissions. We have chosen a basic
         * default value but you may easily change it to any table you like.
         */

        'permissions' => 'permissions',

        /*
         * When using the "HasPermissions" trait from this package, we need to know which
         * table should be used to retrieve your models permissions. We have chosen a
         * basic default value but you may easily change it to any table you like.
         */

        'model_has_permissions' => 'model_has_permissions',

        /*
         * When using the "HasRoles" trait from this package, we need to know which
         * table should be used to retrieve your models roles. We have chosen a
         * basic default value but you may easily change it to any table you like.
         */

        'model_has_roles' => 'model_has_roles',

        /*
         * When using the "HasRoles" trait from this package, we need to know which
         * table should be used to retrieve your roles permissions. We have chosen a
         * basic default value but you may easily change it to any table you like.
         */

        'role_has_permissions' => 'role_has_permissions',
		
		'groups' => 'groups',
		'model_has_groups' => 'model_has_groups',
		'group_has_roles' => 'group_has_roles',
    ],

    'column_names' => [

        /*
         * Change this if you want to name the related model primary key other than
         * `model_id`.
         *
         * For example, this would be nice if your primary keys are all UUIDs. In
         * that case, name this `model_uuid`.
         */
        'model_morph_key' => 'model_id',
    ],

    /*
     * When set to true, the required permission/role names are added to the exception
     * message. This could be considered an information leak in some contexts, so
     * the default setting is false here for optimum safety.
     */

    'display_permission_in_exception' => false,

    'cache' => [

        /*
         * By default all permissions are cached for 24 hours to speed up performance.
         * When permissions or roles are updated the cache is flushed automatically.
         */

        'expiration_time' => \DateInterval::createFromDateString('24 hours'),

        /*
         * The cache key used to store all permissions.
         */

        'key' => 'spatie.permission.cache',

        /*
         * When checking for a permission against a model by passing a Permission
         * instance to the check, this key determines what attribute on the
         * Permissions model is used to cache against.
         *
         * Ideally, this should match your preferred way of checking permissions, eg:
         * `$user->can('view-posts')` would be 'name'.
         */

        'model_key' => 'name',

        /*
         * You may optionally indicate a specific cache driver to use for permission and
         * role caching using any of the `store` drivers listed in the cache.php config
         * file. Using 'default' here means to use the `default` set in cache.php.
         */

        'store' => 'default',
    ],
];

Lumen

您可以通过Composer安装包

composer require wakjoko/laravel-permission

复制所需的文件

mkdir -p config
cp vendor/spatie/laravel-permission/config/permission.php config/permission.php
cp vendor/spatie/laravel-permission/database/migrations/create_permission_tables.php.stub database/migrations/2018_01_01_000000_create_permission_tables.php

您还需要在config/auth.php中创建另一个配置文件。从Laravel仓库获取它或运行以下命令

curl -Ls https://raw.githubusercontent.com/laravel/lumen-framework/5.7/config/auth.php -o config/auth.php

然后,在bootstrap/app.php中注册中间件

$app->routeMiddleware([
    'auth'       => App\Http\Middleware\Authenticate::class,
    'permission' => Spatie\Permission\Middlewares\PermissionMiddleware::class,
    'role'       => Spatie\Permission\Middlewares\RoleMiddleware::class,
	'group'       => Spatie\Permission\Middlewares\GroupMiddleware::class,
]);

以及配置文件、服务提供者和缓存别名

$app->configure('permission');
$app->alias('cache', \Illuminate\Cache\CacheManager::class);  // if you don't have this already
$app->register(Spatie\Permission\PermissionServiceProvider::class);

现在,运行您的迁移

php artisan migrate

用法

首先,将Spatie\Permission\Traits\HasGroups特质添加到您的User模型中

use Illuminate\Foundation\Auth\User as Authenticatable;
use Spatie\Permission\Traits\HasGroups;

class User extends Authenticatable
{
    use HasGroups;

    // ...
}
  • 请注意,如果您需要在其他模型中使用HasGroups特质,例如Page,您还需要将protected $guard_name = 'web';添加到该模型,否则您会收到错误
use Illuminate\Database\Eloquent\Model;
use Spatie\Permission\Traits\HasGroups;

class Page extends Model
{
   use HasGroups;

   protected $guard_name = 'web'; // or whatever guard you want to use

   // ...
}

此包允许将用户与权限和角色关联。每个角色都与多个权限相关联。一个 Role 和一个 Permission 是常规的 Eloquent 模型。它们需要一个 name,可以像这样创建:

use Spatie\Permission\Models\Role;
use Spatie\Permission\Models\Permission;

$role = Role::create(['name' => 'writer']);
$permission = Permission::create(['name' => 'edit articles']);

可以使用以下方法之一将权限分配给角色:

$role->givePermissionTo($permission);
$permission->assignRole($role);

可以使用以下方法之一将多个权限同步到角色:

$role->syncPermissions($permissions);
$permission->syncRoles($roles);

可以使用以下方法之一从角色中删除权限:

$role->revokePermissionTo($permission);
$permission->removeRole($role);

如果您正在使用多个守卫,则还需要设置 guard_name 属性。在 readme 的 使用多个守卫 部分了解更多信息。

HasRoles 特性为您的模型添加了 Eloquent 关系,可以直接访问或用作基础查询:

// get a list of all permissions directly assigned to the user
$permissionNames = $user->getPermissionNames(); // collection of name strings
$permissions = $user->permissions; // collection of permission objects

// get all permissions for the user, either directly, or from roles, or from both
$permissions = $user->getDirectPermissions();
$permissions = $user->getPermissionsViaRoles();
$permissions = $user->getAllPermissions();

// get the names of the user's roles
$roles = $user->getRoleNames(); // Returns a collection

HasRoles 特性还为您模型添加了一个 role 范围,以将查询范围到特定的角色或权限:

$users = User::role('writer')->get(); // Returns only users with the role 'writer'

role 范围可以接受一个字符串,一个 \Spatie\Permission\Models\Role 对象或一个 \Illuminate\Support\Collection 对象。

相同的特性还添加了一个范围,仅获取具有特定权限的用户:

$users = User::permission('edit articles')->get(); // Returns only users with the permission 'edit articles' (inherited or directly)

该范围可以接受一个字符串,一个 \Spatie\Permission\Models\Permission 对象或一个 \Illuminate\Support\Collection 对象。

使用“直接”权限(见下文以使用角色和权限):

可以将权限分配给任何用户:

$user->givePermissionTo('edit articles');

// You can also give multiple permission at once
$user->givePermissionTo('edit articles', 'delete articles');

// You may also pass an array
$user->givePermissionTo(['edit articles', 'delete articles']);

可以从用户中撤销权限:

$user->revokePermissionTo('edit articles');

或一次性撤销和添加新权限:

$user->syncPermissions(['edit articles', 'delete articles']);

您可以使用以下方法检查用户是否具有权限:

$user->hasPermissionTo('edit articles');

或者您可以传递表示权限 ID 的整数:

$user->hasPermissionTo('1');
$user->hasPermissionTo(Permission::find(1)->id);
$user->hasPermissionTo($somePermission->id);

您可以使用以下方法检查用户是否具有数组中的任何权限:

$user->hasAnyPermission(['edit articles', 'publish articles', 'unpublish articles']);

...或者如果用户具有数组中的所有权限:

$user->hasAllPermissions(['edit articles', 'publish articles', 'unpublish articles']);

您也可以通过权限 ID 传递整数进行查找:

$user->hasAnyPermission(['edit articles', 1, 5]);

保存的权限将注册到默认守卫的 Illuminate\Auth\Access\Gate 类。因此,您可以使用 Laravel 的默认 can 函数检查用户是否有权限:

$user->can('edit articles');

通过角色使用权限

可以将角色分配给任何用户:

$user->assignRole('writer');

// You can also assign multiple roles at once
$user->assignRole('writer', 'admin');
// or as an array
$user->assignRole(['writer', 'admin']);

可以从用户中删除角色:

$user->removeRole('writer');

角色也可以同步:

// All current roles will be removed from the user and replaced by the array given
$user->syncRoles(['writer', 'admin']);

您可以使用以下方法确定用户是否具有特定的角色:

$user->hasRole('writer');

您也可以确定用户是否具有给定列表中的任何角色:

$user->hasAnyRole(Role::all());

您也可以确定用户是否具有给定列表中的所有角色:

$user->hasAllRoles(Role::all());

assignRolehasRolehasAnyRolehasAllRolesremoveRole 函数可以接受一个字符串、一个 \Spatie\Permission\Models\Role 对象或一个 \Illuminate\Support\Collection 对象。

可以将权限分配给角色:

$role->givePermissionTo('edit articles');

您可以使用以下方法确定角色是否具有特定的权限:

$role->hasPermissionTo('edit articles');

可以从角色中撤销权限:

$role->revokePermissionTo('edit articles');

givePermissionTorevokePermissionTo 函数可以接受一个字符串或一个 Spatie\Permission\Models\Permission 对象。

权限会自动从角色继承。此外,还可以将单个权限分配给用户。例如:

$role = Role::findByName('writer');
$role->givePermissionTo('edit articles');

$user->assignRole('writer');

$user->givePermissionTo('delete articles');

在上面的示例中,一个角色被赋予编辑文章的权限,并将此角色分配给用户。现在该用户可以编辑文章,并且还可以删除文章。'删除文章' 的权限是用户的直接权限,因为它是直接分配给他们的。当我们调用 $user->hasDirectPermission('delete articles') 时,它返回 true,但对于 $user->hasDirectPermission('edit articles') 返回 false

此方法在构建用于在应用程序中设置角色和用户权限的表单时非常有用,并且希望限制或更改用户的角色继承权限,即允许仅更改用户的直接权限。

您可以列出所有这些权限:

// Direct permissions
$user->getDirectPermissions() // Or $user->permissions;

// Permissions inherited from the user's roles
$user->getPermissionsViaRoles();

// All permissions which apply on the user (inherited and direct)
$user->getAllPermissions();

所有这些响应都是Spatie\Permission\Models\Permission对象的集合。

如果我们遵循前面的例子,第一个响应将是一个包含“删除文章”权限的集合,第二个将是一个包含“编辑文章”权限的集合,第三个将包含两者。

使用Blade指令

此包还添加了Blade指令,以验证当前登录用户是否具有给定角色列表中的所有或任何角色。

可选地,您可以将检查将执行的guard作为第二个参数传入。

Blade和Roles

检查特定角色

@role('writer')
    I am a writer!
@else
    I am not a writer...
@endrole

等同于

@hasrole('writer')
    I am a writer!
@else
    I am not a writer...
@endhasrole

检查列表中的任何角色

@hasanyrole($collectionOfRoles)
    I have one or more of these roles!
@else
    I have none of these roles...
@endhasanyrole
// or
@hasanyrole('writer|admin')
    I am either a writer or an admin or both!
@else
    I have none of these roles...
@endhasanyrole

检查所有角色

@hasallroles($collectionOfRoles)
    I have all of these roles!
@else
    I do not have all of these roles...
@endhasallroles
// or
@hasallroles('writer|admin')
    I am both a writer and an admin!
@else
    I do not have all of these roles...
@endhasallroles

或者,@unlessrole用于检查单个角色的相反操作,如下所示

@unlessrole('does not have this role')
    I do not have the role
@else
    I do have the role
@endunlessrole

Blade和Permissions

此包不会添加任何特定于权限的Blade指令。相反,使用Laravel的本地@can指令来检查用户是否具有特定的权限。

@can('edit articles')
  //
@endcan

@if(auth()->user()->can('edit articles') && $some_other_condition)
  //
@endif

定义超级管理员

我们强烈建议通过设置全局Gate::before规则来检查所需的角色来处理超级管理员。

然后您可以在整个应用程序中使用基于权限的控制的最佳实践,而无需总是在每个地方检查“这是否是超级管理员”。

请参阅关于在您的应用程序中定义超级管理员网关规则(Defining a Super-Admin Gate rule)的此维基文章。

最佳实践 -- 角色 vs 权限

通常最好围绕permissions来编写应用程序的代码。这样,您就可以始终在应用程序的每个地方使用本地的Laravel @cancan()指令。

角色仍然可以用来分组权限,以便于分配,如果确实需要,您还可以使用基于角色的辅助方法。但大多数与应用程序相关的逻辑通常最好使用can方法来控制,这允许Laravel的Gate层做所有的繁重工作。

最佳实践 -- 使用策略

为应用程序功能访问控制提供最佳方式是与模型策略结合。这样,您的应用程序逻辑可以与您的权限规则结合,使您的实现更简单。您可以在以下演示应用程序中找到使用此Laravel Permissions包实现模型策略的示例:https://github.com/drbyte/spatie-permissions-demo/blob/master/app/Policies/PostPolicy.php

使用多个守卫

当使用默认的Laravel认证配置时,上述所有方法都将默认生效,无需额外配置。

但是,当使用多个守卫时,它们将像命名空间一样作用于您的权限和角色。这意味着每个守卫都有自己的权限和角色集,可以分配给其用户模型。

使用多个守卫的权限和角色

当创建新的权限和角色时,如果没有指定守卫,则将使用在auth.guards配置数组中定义的first守卫。当为特定的守卫创建权限和角色时,您必须在模型上指定其guard_name

// Create a superadmin role for the admin users
$role = Role::create(['guard_name' => 'admin', 'name' => 'superadmin']);

// Define a `publish articles` permission for the admin users belonging to the admin guard
$permission = Permission::create(['guard_name' => 'admin', 'name' => 'publish articles']);

// Define a *different* `publish articles` permission for the regular users belonging to the web guard
$permission = Permission::create(['guard_name' => 'web', 'name' => 'publish articles']);

检查用户是否具有特定守卫的权限

$user->hasPermissionTo('publish articles', 'admin');

注意:在确定给定模型上的角色/权限是否有效时,它将按照以下顺序选择守卫:$guard_name属性(模型);配置中的守卫(通过提供者);auth.guards配置数组中定义的第一个守卫;auth.defaults.guard配置。

注意:当使用默认的web守卫之外的其他守卫时,您需要声明每个模型希望使用的guard_name,通过在您的模型中设置$guard_name属性。每个模型一个即可。

注意:如果您的应用程序只使用一个守卫,但不是 web,那么请更改您在 config/auth.php 中列出的守卫的顺序,将主守卫作为默认值并排在定义的守卫列表的第一位。

分配守卫用户的权限和角色

您可以使用与上述 通过角色使用权限 相同的方法来分配权限和角色。只需确保权限或角色上的 guard_name 与用户的守卫匹配,否则将抛出 GuardDoesNotMatch 异常。

使用多个守卫的 blade 指令

您可以通过将您希望使用的守卫作为指令的第二个参数传递来使用在 使用 blade 指令 中列出的所有 blade 指令。

@role('super-admin', 'admin')
    I am a super-admin!
@else
    I am not a super-admin...
@endrole

使用中间件

此包包含 RoleMiddlewarePermissionMiddlewareRoleOrPermissionMiddleware 中间件。您可以在 app/Http/Kernel.php 文件中添加它们。

protected $routeMiddleware = [
    // ...
    'role' => \Spatie\Permission\Middlewares\RoleMiddleware::class,
    'permission' => \Spatie\Permission\Middlewares\PermissionMiddleware::class,
    'role_or_permission' => \Spatie\Permission\Middlewares\RoleOrPermissionMiddleware::class,
];

然后您可以使用中间件规则来保护您的路由。

Route::group(['middleware' => ['role:super-admin']], function () {
    //
});

Route::group(['middleware' => ['permission:publish articles']], function () {
    //
});

Route::group(['middleware' => ['role:super-admin','permission:publish articles']], function () {
    //
});

Route::group(['middleware' => ['role_or_permission:super-admin']], function () {
    //
});

Route::group(['middleware' => ['role_or_permission:publish articles']], function () {
    //
});

或者,您可以使用 |(管道)字符将多个角色或权限分开。

Route::group(['middleware' => ['role:super-admin|writer']], function () {
    //
});

Route::group(['middleware' => ['permission:publish articles|edit articles']], function () {
    //
});

Route::group(['middleware' => ['role_or_permission:super-admin|edit articles']], function () {
    //
});

您也可以通过在构造函数中设置所需的中间件类似地保护您的控制器。

public function __construct()
{
    $this->middleware(['role:super-admin','permission:publish articles|edit articles']);
}
public function __construct()
{
    $this->middleware(['role_or_permission:super-admin|edit articles']);
}

捕获角色和权限失败

如果您想覆盖默认的 403 响应,您可以使用应用程序的异常处理程序捕获 UnauthorizedException

public function render($request, Exception $exception)
{
    if ($exception instanceof \Spatie\Permission\Exceptions\UnauthorizedException) {
        // Code here ...
    }

    return parent::render($request, $exception);
}

使用Artisan命令

您可以使用 artisan 命令从控制台创建角色或权限。

php artisan permission:create-role writer
php artisan permission:create-permission "edit articles"

当为特定守卫创建权限/角色时,您可以指定守卫名称作为第二个参数。

php artisan permission:create-role writer web
php artisan permission:create-permission "edit articles" web

当创建角色时,您还可以同时创建和链接权限。

php artisan permission:create-role writer web "create articles|edit articles"

单元测试

在您的应用程序测试中,如果您没有在测试 setUp() 中作为部分分配角色和权限,那么您可能会遇到一个鸡生蛋的问题,即角色和权限没有在门注册(因为您的测试在门注册之后创建它们)。解决这个问题很简单:在您的测试中,只需添加一个 setUp() 指令来重新注册权限,如下所示

    public function setUp()
    {
        // first include all the normal setUp operations
        parent::setUp();

        // now re-register all the roles and permissions
        $this->app->make(\Spatie\Permission\PermissionRegistrar::class)->registerPermissions();
    }

数据库播种

您可能会发现,在播种之前清除此包的缓存是最佳做法,以避免缓存冲突错误。这可以直接在播种类中完成。以下是一个示例播种器,它首先清除缓存,然后创建权限,最后将权限分配给角色(这些步骤的顺序是有意为之)

use Illuminate\Database\Seeder;
use Spatie\Permission\Models\Role;
use Spatie\Permission\Models\Permission;

class RolesAndPermissionsSeeder extends Seeder
{
    public function run()
    {
        // Reset cached roles and permissions
        app()[\Spatie\Permission\PermissionRegistrar::class]->forgetCachedPermissions();

        // create permissions
        Permission::create(['name' => 'edit articles']);
        Permission::create(['name' => 'delete articles']);
        Permission::create(['name' => 'publish articles']);
        Permission::create(['name' => 'unpublish articles']);

        // create roles and assign created permissions

        // this can be done as separate statements
        $role = Role::create(['name' => 'writer']);
        $role->givePermissionTo('edit articles');

        // or may be done by chaining
        $role = Role::create(['name' => 'moderator'])
            ->givePermissionTo(['publish articles', 'unpublish articles']);

        $role = Role::create(['name' => 'super-admin']);
        $role->givePermissionTo(Permission::all());
    }
}

扩展

如果您需要扩展现有的 RolePermission 模型,请注意以下事项

  • 您的 Role 模型需要扩展 Spatie\Permission\Models\Role 模型
  • 您的 Permission 模型需要扩展 Spatie\Permission\Models\Permission 模型

如果您需要替换现有的 RolePermission 模型,您需要记住以下几点

  • 您的 Role 模型需要实现 Spatie\Permission\Contracts\Role 协议
  • 您的 Permission 模型需要实现 Spatie\Permission\Contracts\Permission 协议

在这两种情况下,无论是扩展还是替换,您都需要在配置中指定您的新模型。为此,您必须在发布配置后使用此命令更新配置文件中的 models.rolemodels.permission

php artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider" --tag="config"

缓存

角色和权限数据被缓存以加快性能。

虽然我们建议不要更改缓存 "key" 名称,但如果您希望更改过期时间,您可以在 config/permission.php 文件中的 cache 数组中这样做。请注意,从 v2.26.0 版本开始,这里的 cache 条目现在是一个数组,而 expiration_time 是一个子数组条目。

当您使用用于操作角色和权限的内置函数时,缓存将自动为您重置,并且关系将自动重新加载当前模型记录。

$user->assignRole('writer');
$user->removeRole('writer');
$user->syncRoles(params);
$role->givePermissionTo('edit articles');
$role->revokePermissionTo('edit articles');
$role->syncPermissions(params);
$permission->assignRole('writer');
$permission->removeRole('writer');
$permission->syncRoles(params);

然而,如果您直接在数据库中操作权限/角色数据而不是调用提供的函数,除非您手动重置缓存,否则您将看不到应用中的更改。

手动重置缓存

要手动重置此包的缓存,您可以在您的应用程序代码中运行以下命令:

app()->make(\Spatie\Permission\PermissionRegistrar::class)->forgetCachedPermissions();

或者,您可以使用 Artisan 命令

php artisan permission:cache-reset

缓存标识符

提示:如果您正在利用缓存服务(如 redismemcached)并且服务器上运行着其他站点,则可能遇到应用程序之间的缓存冲突。建议您在 Laravel 的 /config/cache.php 中设置自己的缓存 prefix,为每个应用程序指定唯一值。这将防止其他应用程序意外使用/更改您的缓存数据。

需要 UI 吗?

此包默认不提供任何屏幕,您需要自行构建。以下是一些启动选项:

测试

composer test

升级

如果您是从 v1 升级到 v2,@fabricecw 准备了一个 存档,可能使数据迁移变得更容易。您还需要删除旧的 laravel-permission.php 配置文件并发布新的 permission.php 文件,并相应地进行编辑。

变更日志

请参阅 CHANGELOG 了解最近的变化。

贡献

请参阅 CONTRIBUTING 了解详细信息。

安全

如果您发现任何安全相关的问题,请通过电子邮件 freek@spatie.be 而不是使用问题跟踪器。

Postcardware

您可以自由使用此包,但如果它进入您的生产环境,我们非常感谢您从您的家乡寄给我们一张明信片,说明您正在使用我们的哪些包。

我们的地址是:Spatie,Samberstraat 69D,2060 安特卫普,比利时。

我们将发布所有收到的明信片 在我们的公司网站上

致谢

此包主要基于 Jeffrey Way 的关于 权限和角色 的精彩 Laracasts 课程。他的原始代码可以在 GitHub 上的 此存储库 中找到。

特别感谢 Alex Vanderbistv2 的巨大帮助,以及 Chris Brown 长期支持我们维护此包。

替代方案

  • Povilas Korop 在 Laravel News 上的文章中很好地列举了替代方案 (链接)。在相同文章中,他还比较了 laravel-permission 和 Joseph Silber 的 Bouncer,我们认为这也是一个非常优秀的包。
  • ultraware/roles 对其功能采用了一种略有不同的方法。

支持我们

Spatie是一家位于比利时安特卫普的网络设计公司。您可以在我们的网站上找到所有开源项目的概述(点击访问)

您的业务是否依赖于我们的贡献?请通过Patreon联系我们并支持我们。所有的承诺都将专门用于分配人力资源以维护和新开发精彩内容。

许可证

MIT许可证(MIT)。有关更多信息,请参阅许可证文件