此包已被废弃,不再维护。没有建议的替代包。

Laravel 5.1/Laravel 5.2 的访问控制列表(ACL)解决方案

0.3.0 2016-05-14 22:39 UTC

This package is not auto-updated.

Last update: 2020-01-24 16:21:34 UTC


README

ResultSystems ACL

ACL 是为 Laravel 5 开发的 ACL 包,它使用分支、组和权限。该项目旨在提供应用程序的访问控制。它考虑了多公司/分支的需求。

安装

ACL 可以通过 composer 安装。要自动将包添加到您的 composer.json 文件中,请执行以下命令

composer require resultsystems/acl

或者,您可以手动添加以下内容

{
    "require": {
        "resultsystems/acl": "~0.3"
    }
}
composer update

2. 提供者

要使用 ACL 在您的 Laravel 应用程序中,需要在您的 config/app.php 文件中注册该包。在 providers 部分的末尾添加以下代码

// inicio do arquivo foi omitido
    'providers' => [
        //Outras entradas omitidas
        ResultSystems\Acl\AclServiceProvider::class, //Laravel 5.1 em diante
    ],
// fim do arquivo foi omitido

3. 用户类

在您的用户类中,添加 trait ResultSystems\Acl\Traits\PermissionTrait 以提供权限检查方法

4. 发布配置文件和迁移文件

要发布随包一起提供的默认配置文件和迁移文件,请执行以下命令

php artisan vendor:publish --provider="ResultSystems\Acl\AclServiceProvider"

执行迁移,以便在数据库中创建表格

php artisan migrate

5. ACL 中间件

如果您需要在路由中直接执行访问控制,ACL 提供了一个中间件(内置),用于处理最常见的用例。要使用它们,需要在您的 app/Http/Kernel.php 文件中注册它们。

Laravel 5.1

protected $routeMiddleware = [
    'auth'            => 'App\Http\Middleware\Authenticate',
    'auth.basic'      => 'Illuminate\Auth\Middleware\AuthenticateWithBasicAuth',
    'guest'           => 'App\Http\Middleware\RedirectIfAuthenticated',

    // Controle de acesso usando permissões
    'needsPermission' => \ResultSystems\Acl\Middlewares\NeedsPermissionMiddleware::class,
];

Laravel 5.2


protected $routeMiddleware = [
        'web' => [
            \App\Http\Middleware\EncryptCookies::class,
            \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
            \Illuminate\Session\Middleware\StartSession::class,
            \Illuminate\View\Middleware\ShareErrorsFromSession::class,
            \App\Http\Middleware\VerifyCsrfToken::class,
            // Controle de acesso usando permissões para WEB
            'needsPermission' => \ResultSystems\Acl\Middlewares\NeedsPermissionMiddleware::class,
        ],
        'api' => [
            'throttle:60,1',
            // Controle de acesso usando permissões para API
            'needsPermission' => \ResultSystems\Acl\Middlewares\NeedsPermissionMiddleware::class,
        ],

];

使用 ACL

配置文件 config/acl.php

这些中间件的用法将在下一节中解释。

#如何在路由中使用

Route::post('/users', ['middleware' => ['auth', 'needsPermission'],
    'permission'               => ['user.read', 'user.create'],
    'any'                      => false, //usuário precisará ter as duas permissões
    /**
     * Caso a configuração em `config/acl.php`
     * middleware->autoload for true,
     * você poderá omitir a informação da owner_id
     */
     'owner_id'                => 'middleware', /*
    function () {
        dd('Tenho permissão');
    }]);
Route::post('/users', ['middleware' => ['auth', 'needsPermission'],
    'permission'               => ['user.read', 'user.create'],
    'any'                      => false, //usuário precisará ter as duas permissões
    'owner_id'                => 1, // Empresa/filial *
    function () {
        dd('Tenho permissão');
    }]);
Route::get('/users', [
    'middleware' => ['auth', 'needsPermission:user.read|user.create,true,5'],

    function () {
        dd('Tenho permissão');
    }]);

    //needsPermission=middleware
    //user.read=permissão user.read
    //user.create=permissão user.create
    //any=true Usuário pode ter qualquer das permissões informadas
    //5=Filial/Empresa

使用带自动搜索的中间件

Route::post('/users', ['middleware' => ['auth', 'needsPermission'],
    'permission'               => ['user.read', 'user.create'],
    'any'                      => false, //usuário precisará ter as duas permissões
    'owner_id'                => 'middleware', //*
    function () {
        dd('Tenho permissão');
    }]);
  • 如果没有传递 :id 或 'middleware',也没有配置通过中间件获取 owner_id,则将仅搜索 owner_id 为 null 的权限

#使用 Auth 进行使用

您可以使用 Auth 在用户认证的任何地方使用它。

示例

if (Auth::user()->hasPermission('user.create')) {
    echo 'tenho permissão';
}

if (Auth::user()->hasPermissions(['user.create', 'user.update'])) {
    echo 'tenho pelo menos uma das permissões';
}

if (Auth::user()->hasPermissions(['user.create', 'user.update'], false)) {
    echo 'tenho ambas as permissões';
}

if (Auth::user()->hasPermissions(['user.create', 'user.update'], false, 1)) {
    echo 'tenho ambas as permissões na filial 1';
}

if (Auth::user()->hasPermissions(['user.create', 'user.update'], true, 1)) {
    echo 'tenho pelo menos uma das permissões na filial 1';
}

config/acl.php

return [
    //Informe a tabela de usuário aqui
    'tables' => [
        'user' => 'users',
    ],

    //Informe o model usuado que conecta a tabela de usuário
    'model' => \App\User::class,

    /**
     * Informe a class que negará acesso
     * caso usuário não tenha permissão
     * você pode criar uma personalizada,
     * porem precisa estender esta.
     */
    'forbidden_callback' => ResultSystems\Acl\Handlers\ForbiddenHandler::class,
    /**
     * Middleware para pegar a filial automaticamente
     * para você não precisar informar na rota ou no controler
     */
    'middleware' => [
        //Auto carrega o middleware em todas as rotas
        'autoload' => false, //Auto load middleware in all reques

        // Middleware utilizado para compatibilidade com o `Auth` do Laravel
        'owner'   => ResultSystems\Acl\Middlewares\AuthOwnerMiddleware::class,

        // Middleware utilizado para compatibilidade com o `Jwt`
        // mais informações https://github.com/tymondesigns/jwt-auth
        //'owner'    => ResultSystems\Acl\Middlewares\JwtOwnerMiddleware::class,

        /**
         * Campo no Auth::user()
         * ou no JWT (Neste caso campo adicional)
         * que representa a filial/owner atual
         */
        'owner_id' => 'owner_id',
    ],
];