leandrodiogenes/authorization

原生的Laravel授权。

安装: 920

依赖者: 0

建议者: 0

安全: 0

星标: 0

关注者: 1

分支: 13

类型:项目

v4.0.0 2023-05-21 19:19 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。