【问题标题】:Laravel Passport- Protect routes for different user typesLaravel Passport - 保护不同用户类型的路由
【发布时间】:2018-08-20 02:43:42
【问题描述】:

我在 laravel 中使用 passport 在 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',
        ],
    ],

【问题讨论】:

  • 嗨,我也有同样的问题。如何解决问题?

标签: php laravel authentication oauth-2.0 laravel-passport


【解决方案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: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 未授权错误,如果卖家尝试访问此路由,它将正常访问该路由的代码。

【讨论】:

    猜你喜欢
    • 2020-05-18
    • 2017-05-15
    • 2019-10-28
    • 2022-11-16
    • 2013-08-01
    • 2016-09-13
    • 2019-09-13
    • 2023-03-28
    • 2018-01-27
    相关资源
    最近更新 更多