如何在带警卫的流明中实现多重身份验证?

Posted

技术标签:

【中文标题】如何在带警卫的流明中实现多重身份验证?【英文标题】:How to implement multiple authentication in lumen with guards? 【发布时间】:2020-08-08 18:00:06 【问题描述】:

我是 lumen 的新手。我在互联网上搜索并没有找到正确的答案,所以我发布了这个问题。我已经实现了身份验证,并且效果非常好。 现在的问题是,当我尝试使用 auth guard 中间件实现多个身份验证时,我不知道如何实现它。

到目前为止我所做的事情 -

在 bootstrap/app.php 中取消注释

$app->withFacades();
$app->withEloquent();
$app->routeMiddleware(['auth' => App\Http\Middleware\Authenticate::class,]);
$app->register(App\Providers\AppServiceProvider::class);
$app->register(App\Providers\AuthServiceProvider::class);
$app->register(App\Providers\EventServiceProvider::class);

为客户和管理员创建迁移、模型和登录/注册控制器。

创建配置/auth.php

<?php

return [

    /*
    |--------------------------------------------------------------------------
    | Authentication Defaults
    |--------------------------------------------------------------------------
    |
    */

    'defaults' => [
        'guard' => env('AUTH_GUARD', 'customer'),
    ],

    /*
    |--------------------------------------------------------------------------
    | Authentication Guards
    |--------------------------------------------------------------------------
    |
    */

    'guards' => [
        'customer' => [
            'driver' => 'token',
            'provider' => 'customers',
        ],
        'admin' => [
            'driver' => 'token',
            'provider' => 'admins',
        ]
    ],

    /*
    |--------------------------------------------------------------------------
    | User Providers
    |--------------------------------------------------------------------------
    |
    */

    'providers' => [
        'customers' => [
            'driver' => 'eloquent',
            'model' => App\Model\Customer\Customer::class,
        ],
        'admins' => [
            'driver' => 'eloquent',
            'model' => App\Model\Admin\Admin::class,
        ]
    ],

    /*
    |--------------------------------------------------------------------------
    | Resetting Passwords
    |--------------------------------------------------------------------------
    |
    */

    'passwords' => [
        //
    ],

];

我的认证服务商

public function boot()

  $this->app['auth']->viaRequest('token', function ($request) 
    if ($request->input('api_token')) 
      return Customer::where('api_token', $request->input('api_token'))->first();
    
  );

如果您注意到,它当前仅对 Customer 模型进行身份验证。不管我用的是什么警卫。 请让我知道如何使其动态化。

** 我没有使用 JWT 或任何其他驱动程序。

【问题讨论】:

【参考方案1】:

这可能已经晚了,但我也遇到了类似的问题。 我也尝试使用身份验证保护,但我无法让它工作,我使用了路由前缀。 阅读文档后 Again, you may retrieve the authenticated user however you wish. 我试过这个

public function boot()

    $this->app['auth']->viaRequest('token', function ($request) 
        
        if ($request->input('api_token')) 
            if ($request->is('c/*')) 
                // Prefix for Customer endpoints
                return Customer::where('api_token', $request->input('api_token'))->first();
             elseif ($request->is('admin/*')) 
                // Prefix for Admin endpoints
                return Admin::where('api_token', $request->input('api_token'))->first();
            
        
    );

你也可以使用Gates/Policies

【讨论】:

以上是关于如何在带警卫的流明中实现多重身份验证?的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 多重身份验证 |路由中间件

如何在 WCF 服务中实现自定义身份验证

如何在视图模型中实现 Firebase 电话身份验证?

如何在 laravel 刀片模板中检查当前的身份验证守卫及其来宾?

如何在 Next.js 中实现身份验证

如何在基于 JWT 的单点登录身份验证架构中实现注销?