首页 文章

Laravel Passport将中间件添加到默认的身份验证/令牌路由

提问于
浏览
0

我正在尝试构建一个多租户应用程序并在我的中间件中的数据库之间切换

所以我有以下中间件

public function handle($request, Closure $next)
{
    //check if request has the value of header
    $passedheader = $request->header('HTTP_X_APP_LOCATION');

    $headers = AppConnectionsModel::get()->pluck('header_val')->toArray();

    if(!isset($passedheader) || !in_array($passedheader,$headers)){
        return response('Invalid Request.', 403);
    }

    //get the actual header passed
    $connection = AppConnectionsModel::where('header_val',$passedheader)->first();
    if($connection){
        Config::set('database.connections.tennant.database', $connection->database);
        Config::set('database.connections.tennant.port', $connection->port);
        Config::set('database.connections.tennant.username', $connection->username);
        Config::set('database.connections.tennant.password', $connection->password);
        Config::set('database.connections.tennant.host', $connection->host);


       return $next($request);

    }else{
        return response("Invalid Request.", 200);
    }

    return $next($request);
}

所以基本上中间件的作用是检查连接设置并设置为配置

所以我想将此中间件应用于 oauth/token 的护照令牌路由,以便每次用户发送获取令牌的请求时,使用他或她的数据库

在我的用户模型中我有

protected $connection = "tennant";
protected $table = "tbl_user";

如何覆盖laravel中的oauth / token护照路径以使用此中间件

如下所示,我也尝试在内核文件中更改中间件优先级

protected $routeMiddleware = [
    'appconnection' => \App\Http\Middleware\AppConnectionMiddleware::class,
    'auth' => \Illuminate\Auth\Middleware\Authenticate::class,
    'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
    'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
    'can' => \Illuminate\Auth\Middleware\Authorize::class,
    'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
    'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
    'role' => \Zizaco\Entrust\Middleware\EntrustRole::class,
    'permission' => \Zizaco\Entrust\Middleware\EntrustPermission::class,
    'ability' => \Zizaco\Entrust\Middleware\EntrustAbility::class,

];

应用程序连接是我们已经放置在顶部的中间件,具有上面显示的句柄方法但它不会在护照oauth /令牌路由之前执行

检查我的配置护照路线设置在 AuthServiceProvider 之类

class AuthServiceProvider extends ServiceProvider
  {
  protected $policies = [
      'App\Model' => 'App\Policies\ModelPolicy',
  ];

/**
 * Register any authentication / authorization services.
 *
 * @return void
 */
public function boot()
{
    $this->registerPolicies();
    Passport::routes();
    //
}

}

1 回答

  • 1

    你需要在 Kernel.php 文件中添加一个数组 .

    protected $middlewarePriority = [
        \App\Http\Middleware\AppConnectionMiddleware::class,
        \Laravel\Passport\Http\Middleware\CheckClientCredentials::class
    ];
    

    请这样看,它应该工作 .

    护照路线

    Route::group(['middleware'=>'appconnection'], function(){ 
        Passport::routes(); 
    });
    

相关问题