Laravel 5.4中间件无法定义防护

时间:2017-08-16 13:29:31

标签: php laravel laravel-5.4

我有以下文件:

routes.php文件

Route::get('client-portal', 'DashboardController@index');

DashboardController.php

public function __construct()
{
    $this->middleware('auth:client-users');
}

auth.php

'guards' => [
    'web' => [
        'driver' => 'session',
        'provider' => 'users',
    ],
    'client-users' => [
        'driver' => 'session',
        'provider' => 'client-users',
    ],
    'api' => [
        'driver' => 'token',
        'provider' => 'users',
    ],
],
'providers' => [
    'users' => [
        'driver' => 'eloquent',
        'model' => App\Models\User::class,
    ],
    'client-users' => [
        'driver' => 'eloquent',
        'model' => \App\Models\ClientPortal\User::class
    ],
],

Authenticate.php

public function __construct(Guard $auth) {
    $this->auth = $auth;
}

public function handle($request, Closure $next)
{
    if ($this->auth->guest()) {
        if ($request->ajax()) {
            return response('Unauthorized.', 401);
        } else {
            dd($this->auth);
            return redirect()->guest('login');
        }
    }

    return $next($request);
}

每当我通过client-users登录并导航到/client-portal.时,来自dd的{​​{1}}会返回Authenticate.php个实例,其属性为SessionGuard设置为name

但是,我确实指定了#auth:客户端用户'在控制器的构造函数中。 所以我的第一个想法是认证中间件是全球中间件所以我检查了,但它不是。如果我从构造函数中删除中间件行,则会显示该页面。

有谁知道问题出在哪里?

谢谢。

1 个答案:

答案 0 :(得分:0)

显然,传递给__construct的实例不支持用于指定防护的:符号。此Authenticate.php是以前版本的laravel中的原始文件。 guard属性作为第三个参数传递给handle

我修改了代码如下:

class Authenticate
{
    public function handle($request, Closure $next, $guard = null)
    {
        auth()->shouldUse($guard);
        if (auth()->guest()) {
            if ($request->ajax()) {
                return response('Unauthorized.', 401);
            } else {
                return redirect()->guest('login');
            }
        }

        return $next($request);
    }
}