在流明中创建多个Auth提供程序

时间:2017-08-11 09:25:36

标签: php laravel authentication middleware lumen

我正在尝试为我的API创建多个Auth Guards和服务。我希望特定用户可以使用特定组(更像是没有会话的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);

并在中间件文件夹中创建了文件 Admin.php APi.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 文件夹中的 AdminServiceProvider ApiServiceProvider ,其中包含此功能 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

但我得到以下错误:

Error

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

此致

1 个答案:

答案 0 :(得分:0)

我最终使用的东西更像是一种变通方法,但是我认为这可能是应该使用的方式。

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

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

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

致谢