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

Posted

技术标签:

【中文标题】Laravel Passport - 保护不同用户类型的路由【英文标题】:Laravel Passport- Protect routes for different user types 【发布时间】: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',
        ],
    ],

【问题讨论】:

嗨,我也有同样的问题。如何解决问题? 【参考方案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 未授权错误,如果卖家尝试访问此路由,它将正常访问该路由的代码。

【讨论】:

以上是关于Laravel Passport - 保护不同用户类型的路由的主要内容,如果未能解决你的问题,请参考以下文章

身份验证用户提供程序 [passport] 未使用 laravel 护照定义

如何使用 Laravel Passport 组织这样的路由保护?

在 Laravel Passport 中将用户模型主键 ID 更改为另一个

Laravel Passport 来自同一端点的响应同时来自两个用户的两个不同的 access_tokens 在两种情况下都返回第一个用户

[PHP] 浅谈 Laravel auth:api 不同驱动 token 和 passport 的区别

使用 Laravel Passport 范围进行单元测试