Laravel Passport-保护不同用户类型的路线

时间:2018-03-12 06:15:51

标签: php laravel authentication oauth-2.0 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检查似乎不起作用,因为我可以访问卖家的所有路由,即使我已经传递了在Bearer标头中为api生成的令牌。

我的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',
        ],
    ],

1 个答案:

答案 0 :(得分:0)

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:apisellers中间件:

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未经授权的错误,如果卖方尝试访问此路由,则它将照常继续处理该路由的代码。

相关问题