Ресурсы контроллера доступа на основе разрешений Laravel / Spatie - PullRequest
0 голосов
/ 05 июля 2019

Я работаю над API паспортов Laravel, в котором я использую пакет spatie для пользовательских ролей и разрешений.Я должен выполнить определенную операцию ('store', 'view', 'update', 'delete') на основании разрешений пользователя.Для этого я создал черту и использовал ее в контроллере, но она работает неправильно.При каждом запросе API выдается исключение «Это действие не авторизовано», либо у пользователя есть разрешение, либо нет.

Авторизовать черту:

<?php

namespace App;
/*
 * A trait to handle authorization based on users permissions for given controller
 */

trait Authorizable
{
    /**
     * Abilities
     *
     * @var array
     */
    private $abilities = [
        'index' => 'view',
        'edit' => 'edit',
        'show' => 'view',
        'update' => 'edit',
        'create' => 'add',
        'store' => 'add',
        'destroy' => 'delete'
    ];

    /**
     * Override of callAction to perform the authorization before it calls the action
     *
     * @param $method
     * @param $parameters
     * @return mixed
     */
    public function callAction($method, $parameters)
    {
        if( $ability = $this->getAbility($method) ) {
            $this->authorize($ability);
        }

        return parent::callAction($method, $parameters);
    }

    /**
     * Get ability
     *
     * @param $method
     * @return null|string
     */
    public function getAbility($method)
    {
        $routeName = explode('.', \Request::route()->getName());
        $action = array_get($this->getAbilities(), $method);

        return $action ? $action . '_' . $routeName[0] : null;
    }

    /**
     * @return array
     */
    private function getAbilities()
    {
        return $this->abilities;
    }

    /**
     * @param array $abilities
     */
    public function setAbilities($abilities)
    {
        $this->abilities = $abilities;
    }
}

Маршруты:

Route::middleware('auth:api')->group(function () {
        Route::post('user', 'ApiController@user');
        Route::post('view_department', 'DepartmentController@index');
        Route::post('add_department', 'DepartmentController@store');
        Route::post('edit_department', 'DepartmentController@update');
        Route::post('delete_department', 'DepartmentController@destroy');

        Route::post('/logout', 'ApiController@logout');
    }); // auth middleware ends

Контроллер:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Carbon\Carbon;
use App\User;
use App\Authorizable;
use Illuminate\Support\Facades\Validator;
use App\Department;
use Spatie\Permission\Models\Role;
use Spatie\Permission\Models\Permission;

class DepartmentController extends Controller
{
     use Authorizable;

        //
    public function index(Request $request) {

        // return response
        return response()->json([
            'success' => 'You have the permission to view departments!']);
    }

    //
    public function store(Request $request) {
        // validate the posted data
        $validator = Validator::make($request->all(), [
            'name' => 'required|string|unique:departments',
        ]);
        // return errors
        if ($validator->fails())
        {
            return response(['errors'=>$validator->errors()->all()]);
        }

        $department = new Department;
        $department->name = $request->name;
        $department->save();

        // return response
        return response()->json([
            'success' => 'Successfully created department!']);
    }
}

Я плохо разбираюсь в этом, не знаю, где я иду не так.Буду очень признателен, если кто-нибудь проведет меня через это.Спасибо,

...