在 Lumen 中创建多个身份验证提供程序

Posted

技术标签:

【中文标题】在 Lumen 中创建多个身份验证提供程序【英文标题】:Creating Multiple Auth Providers in Lumen 【发布时间】:2018-01-19 18:06:10 【问题描述】:

我正在尝试为我的 API 创建多个 Auth Guard 和服务。我希望特定用户可以使用特定组(更像是没有会话的 RBAC)。

如果用户尝试访问以admin:auth 作为中间件的组,则会检查其权限。如果它有api:auth,则没有权限检查。

我不明白该怎么做。我在 bootstrap/app.php

中添加了以下几行
$app->routeMiddleware([
    'admin' => App\Http\Middleware\Admin::class,
    'api' => App\Http\Middleware\Api::class,
]);

还有:

$app->register(App\Providers\AdminServiceProvider::class);
$app->register(App\Providers\ApiServiceProvider::class);

并在Middleware文件夹中创建文件Admin.phpAPi.php,内容如下(与Authenticate.php基本相同)改名)

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Contracts\Auth\Factory as Auth;

class Admin

    /**
     * The authentication guard factory instance.
     *
     * @var \Illuminate\Contracts\Auth\Factory
     */
    protected $auth;

    /**
     * Create a new middleware instance.
     *
     * @param  \Illuminate\Contracts\Auth\Factory  $auth
     * @return void
     */
    public function __construct(Auth $auth)
    
        $this->auth = $auth;
    

    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @param  string|null  $guard
     * @return mixed
     */
    public function handle($request, Closure $next, $guard = null)
    
        if ($this->auth->guard($guard)->guest()) 
            return response('Unauthorized.', 401);
        

        return $next($request);
    

App\Providers 文件夹中的 AdminServiceProviderApiServiceProvider 仅在函数 boot() 中使用此功能:

var_dump($this->app['api']);exit;

还有这个在上面:

namespace App\Providers;

use App\User;
use Illuminate\Support\Facades\Gate;
use Illuminate\Support\ServiceProvider;

class ApiServiceProvider extends ServiceProvider

但我收到以下错误:

我错过了什么?我已经做了composer dump-autoload,没区别。

问候

【问题讨论】:

您好,您找到解决方案了吗?我得到了同样的错误:( @Jicao:我想我改变了我的方法。我将一个中间件添加到父组,然后将另一个中间件添加到另一个组。我创建了我的 URL 树以遵循中间件逻辑。 @echo_salik,你能发布你的解决方案吗?我想完成同样的事情。 @bou2you 我使用了组,一个带有一个中间件的父组和一个带有另一个中间件的子组。这不是一个程序化的解决方案,更像是一种变通方法,我将在今天晚些时候将其作为答案发布。 @echo_salik 谢谢。是的,如果您可以发布您的解决方案,以便我了解您如何使其工作,那真的会帮助我。 :) 【参考方案1】:

好吧,我最终使用的更像是一种解决方法,但我认为这可能是它应该使用的方式。

所以我所做的是使用我需要的中间件创建了两个组(父母和孩子),如下所示:

$app->group(["middleware" => "middleware1"], function() use ($app)
  $app->group(["middleware" => "middleware1"], function() use ($app)
    $app->post("/signin", "AppController@signin");
  

这样,经过2个中间件后到达signin路由。

问候

【讨论】:

以上是关于在 Lumen 中创建多个身份验证提供程序的主要内容,如果未能解决你的问题,请参考以下文章

Lumen 中的中间件身份验证 [未找到“身份验证”类]

Lumen 如何验证用户和客户端

如何在 Laravel 5.2 中创建多重身份验证

在 Laravel 5.3 中使用多个身份验证?

如何使用相同的身份验证保护验证多种类型的用户 [Lumen]

在 Azure AD 中创建用户之前,是不是可以使用 Azure B2C 自定义策略验证来自社交身份提供商 (iDP) 的电子邮件声明?