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