Laravel Passport - защита маршрутов для разных типов пользователей.

Я использую passport в laravel для аутентификации моих пользователей в API. Я могу аутентифицировать разные типы пользователей из разных таблиц и генерировать для них разные токены, но маршруты не защищены. Например. Пользователь может получить доступ к таким маршрутам

Route::group(['middleware'  =>  'auth:api'], function () {
    Route::group(['prefix'  =>  'v1'], function () {
        Route::get('get-seller-list','API\v1\SellersController@index');
    });
});

и продавец может получить доступ к таким маршрутам, как

Route::group(['middleware'  =>  'auth:sellers'], function () {
    Route::group(['prefix'  =>  'v1'], function () {
    Route::get('get-seller-detail','API\v1\TestController@getDetails');
    });
});

но эта middleware проверка, похоже, не работает, поскольку я могу получить доступ ко всем маршрутам для продавцов, даже если я передал токен, сгенерированный для api, в заголовке Bearer.

Мой config / auth.php выглядит как

'guards' => [
        'user' => [
            'driver' => 'session',
            'provider' => 'users',
        ],

        'seller' => [
            'driver' => 'passport',
            'provider' => 'sellers',
        ],

        'admin' => [
            'driver' => 'session',
            'provider' => 'admins',
        ],

        'web' => [
            'driver' => 'session',
            'provider' => 'users',
        ],

        'api' => [
            'driver' => 'passport',
            'provider' => 'users',
        ],
    ],

person baig772    schedule 12.03.2018    source источник
comment
Привет, у меня такая же проблема. как решить проблему?   -  person Maryam    schedule 17.10.2018


Ответы (1)


Промежуточное ПО auth:api будет обрабатывать аутентификацию токена паспорта, а промежуточное ПО sellers будет проверять, являются ли пользователи продавцами. Я думаю, вы запутались в том, как настроено промежуточное ПО.

Это зависит от того, как у вас настроены типы пользователей, но в вашем sellers промежуточном программном обеспечении вы можете проверить типы / роли пользователей:

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Contracts\Auth\Guard;

class Sellers
{
    /**
     * The Guard implementation.
     *
     * @var Guard
     */
    protected $auth;

    /**
     * Create a new filter instance.
     *
     * @param  Guard  $auth
     * @return void
     */
    public function __construct(Guard $auth)
    {
        $this->auth = $auth;
    }

    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        if ($this->auth->user()->is_seller) {
            return $next($request);
        }

         return response()->view('errors.401', [], 401);
    }
}

Затем вы можете настроить свой маршрут для использования как auth:api, так и sellers промежуточного программного обеспечения:

Route::group(['middleware'  =>  ['auth:api', 'sellers']], function () {
    Route::group(['prefix'  =>  'v1'], function () {
    Route::get('get-seller-detail','API\v1\TestController@getDetails');
    });
});

Итак, теперь, если обычный пользователь попытается получить доступ к маршруту get-seller-detail, он вернет ошибку 401 неавторизованный, и если продавец попытается получить доступ к этому маршруту, он перейдет к коду для этого маршрута как обычно.

person user3574492    schedule 22.06.2018