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: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 未授权错误,如果卖家尝试访问此路由,它将正常访问该路由的代码。
【讨论】:
以上是关于Laravel Passport - 保护不同用户类型的路由的主要内容,如果未能解决你的问题,请参考以下文章
身份验证用户提供程序 [passport] 未使用 laravel 护照定义
如何使用 Laravel Passport 组织这样的路由保护?
在 Laravel Passport 中将用户模型主键 ID 更改为另一个
Laravel Passport 来自同一端点的响应同时来自两个用户的两个不同的 access_tokens 在两种情况下都返回第一个用户