larapacks/authorization

原生Laravel授权。

安装: 10,378

依赖项: 3

建议者: 0

安全: 0

星标: 54

关注者: 4

分支: 13

开放问题: 0

类型:项目

v2.3.2 2021-05-13 15:20 UTC

This package is auto-updated.

Last update: 2024-08-29 04:09:10 UTC


README

Build Status Scrutinizer Code Quality Total Downloads Latest Stable Version License

一个简单易用的Laravel角色/权限管理系统。

🚨 仓库已迁移 🚨

此仓库已迁移至: DirectoryTree/Authorization

索引

安装

注意:需要Laravel 5.5或更高版本。

要开始使用,请通过Composer包管理器安装Authorization

composer require larapacks/authorization

Authorization服务提供程序将自身的数据库迁移目录注册到框架中,因此您应该在安装包后迁移数据库。Authorization迁移将创建应用程序存储角色和权限所需的表

php artisan migrate

现在将 Larapacks\Authorization\Traits\Authorizable 插入到您的 App\Models\User 模型中

<?php

namespace App\Models;

use Larapacks\Authorization\Traits\Authorizable;
use Illuminate\Foundation\Auth\User as Authenticatable;

class User extends Authenticatable
{
    use Authorizable;
    
    // ...
}

您现在可以进行用户授权。

迁移自定义

如果您不想使用Authorization的默认迁移,您应该在您的 AppServiceProviderregister 方法中调用 Authorization::ignoreMigrations 方法。您可以使用 php artisan vendor:publish --tag=authorization-migrations 导出默认迁移。

use Larapacks\Authorization\Authorization;

/**
 * Register any application services.
 *
 * @return void
 */
public function register()
{
    Authorization::ignoreMigrations();
}

模型自定义

默认情况下,App\Models\User 类被注册为可授权的用户模型。

您可以根据需要扩展Authorization内部使用的模型,或创建自己的模型。

通过您的 AuthServiceProvider 中的 Authorization 类指示Authorization使用您自己的模型

use App\Models\User;
use App\Models\Role;
use App\Models\Permission;
use Larapacks\Authorization\Authorization;

/**
 * Register any authentication / authorization services.
 *
 * @return void
 */
public function boot()
{
    $this->registerPolicies();

    Authorization::useUserModel(User::class);
    Authorization::useRoleModel(Role::class);
    Authorization::usePermissionModel(Permission::class);
}

请确保为每个自定义模型添加相关的特性

角色模型:

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Larapacks\Authorization\Traits\ManagesPermissions;

class Role extends Model
{
    use ManagesPermissions;
}

权限模型:

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Larapacks\Authorization\Traits\HasUsers;
use Larapacks\Authorization\Traits\HasRoles;
use Larapacks\Authorization\Traits\ClearsCachedPermissions;

class Permission extends Model
{
    use HasUsers, HasRoles, ClearsCachedPermissions;
}

使用方法

Authorization利用原生的Laravel关系,因此无需学习新的API。

创建一个权限

$createUsers = new Permission();

$createUsers->name = 'users.create';
$createUsers->label = 'Create Users';

$createUsers->save();

将权限授予一个角色

$administrator = new Role();

$administrator->name = 'administrator';
$administrator->label = 'Admin';

$administrator->save();

$administrator->permissions()->save($createUsers);

现在将角色分配给用户

$user->roles()->save($administrator);

您还可以创建特定于用户的权限

$createUsers = new Permission();

$createUsers->name = 'users.create';
$createUsers->label = 'Create Users';

$createUsers->save();

$user->permissions()->save($createUsers);

检查权限 & 角色

使用Laravel原生的 $user->can() 方法

if ($user->can('users.create')) {
    // This user can create other users.
}

在您的控制器中使用Laravel原生的 authorize() 方法

public function create()
{
    $this->authorize('users.create');

    User::create(['...']);
}

使用Laravel原生的 Gate 门面

if (Gate::allows('users.create')) {
    //
}

在您的视图中使用Laravel原生的 @can 指令

@can('users.create')
    <!-- This user can create other users. -->
@endcan

检查权限 & 角色(使用Authorization包方法)

检查权限

// Using the permissions name.
if ($user->hasPermission('users.create')) {
    //
}

// Using the permissions model.
if ($user->hasPermission($createUsers)) {
    //
}

检查多个权限

if (auth()->user()->hasPermissions(['users.create', 'users.edit'])) {
    // This user has both creation and edit rights.
} else {
    // It looks like the user doesn't have one of the specified permissions.
}

检查用户是否有任何权限

if (auth()->user()->hasAnyPermissions(['users.create', 'users.edit', 'users.destroy'])) {
    // This user either has create, edit or destroy permissions.
} else {
    // It looks like the user doesn't have any of the specified permissions.
}

检查用户是否有角色

if (auth()->user()->hasRole('administrator')) {
    // This user is an administrator.
} else {
    // It looks like the user isn't an administrator.
}

检查用户是否有指定的角色

if (auth()->user()->hasRoles(['administrator', 'member'])) {
    // This user is an administrator and a member.
} else {
    // It looks like the user isn't an administrator or member.
}

检查用户是否有任何指定的角色

if (auth()->user()->hasAnyRoles(['administrator', 'member', 'guest'])) {
    // This user is either an administrator, member or guest.
} else {
    // It looks like the user doesn't have any of these roles.
}

缓存

默认情况下,所有权限都会被缓存以防止在每次请求时检索。

当权限被创建、更新或删除时,此缓存会自动刷新。

如果您想禁用缓存,请在您的 AuthServiceProvider 中调用 Authorization::disablePermissionCache

use Larapacks\Authorization\Authorization;

/**
 * Register any authentication / authorization services.
 *
 * @return void
 */
public function boot()
{
    $this->registerPolicies();

    Authorization::disablePermissionCache();
}

缓存键

默认情况下,权限缓存键是 authorization.permissions

要更改缓存键,请在您的 AuthServiceProvider 中调用 Authorization::cacheKey

use Larapacks\Authorization\Authorization;

/**
 * Register any authentication / authorization services.
 *
 * @return void
 */
public function boot()
{
    $this->registerPolicies();

    Authorization::cacheKey('my-key');
}

缓存过期时间

默认情况下,权限缓存每天过期。

要更改此过期日期,请在您的 AuthServiceProvider 中调用 Authorization::cacheExpiresIn

use Larapacks\Authorization\Authorization;

/**
 * Register any authentication / authorization services.
 *
 * @return void
 */
public function boot()
{
    $this->registerPolicies();

    Authorization::cacheExpiresIn(now()->addWeek());
}

门面注册

默认情况下,所有您创建的权限都会注册到Laravel的Gate中。

如果您想禁用此功能,请在您的 AuthServiceProvider 中调用 Authorization::disableGateRegistration

use Larapacks\Authorization\Authorization;

/**
 * Register any authentication / authorization services.
 *
 * @return void
 */
public function boot()
{
    $this->registerPolicies();

    Authorization::disableGateRegistration();
}

中间件

Authorization包括两个有用的中间件类,您可以为您的路由使用它们。

将它们插入到您的 app/Http/Kernel.php

/**
 * The application's route middleware.
 *
 * These middleware may be assigned to groups or used individually.
 *
 * @var array
 */
protected $routeMiddleware = [
    'auth' => \App\Http\Middleware\Authenticate::class,
    'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
    'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
    'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,

    // The role middleware:
    'role' => \Larapacks\Authorization\Middleware\RoleMiddleware::class,

    // The permission middleware:
    'permission' => \Larapacks\Authorization\Middleware\PermissionMiddleware::class,
];

一旦添加,就可以开始使用它们。

注意:当用户使用中间件不符合要求时,会抛出403 HTTP异常。

保护路由以仅允许特定权限

Route::get('users', [
    'uses' => 'UsersController@index',
    'middleware' => 'permission:users.index',
]);

// Multiple permissions:
Route::get('users', [
    'uses' => 'UsersController@index',
    // Users must have index **and** create rights to access this route.
    'middleware' => 'permission:users.index,users.create',
]);

保护路由以允许特定角色

Route::get('users', [
    'uses' => 'UsersController@index',
    'middleware' => 'role:administrator',
]);

// Multiple roles:
Route::get('users', [
    'uses' => 'UsersController@index',
    // Users must be an administrator **and** a member to access this route.
    'middleware' => 'role:administrator,member',
]);

运行测试

要运行应用程序的测试,必须在运行测试权限之前,在TestCase::setUp()方法中实例化PermissionRegistrar,以确保权限能够正确注册。

use Larapacks\Authorization\PermissionRegistrar;
protected function setUp() : void
{
    parent::setUp();

    app(PermissionResistrar::class)->register();
}

将v1升级到v2

配置

现在通过Authorization类的静态方法来完成配置。

您可以删除已发布的config/authorization.php文件。

特质

UserRolesTrait已重命名为Authorizable

PermissionRolesTrait已拆分为多个特质。您必须应用HasRolesHasUsersClearsCachedPermissions特质。

RolePermissionsTrait已重命名为ManagesPermissions

闭包权限

已删除权限闭包。如果您仍然需要此功能,请继续使用v1。