Laravel 5.2 - Использование Auth::check() не работает в MIddleware

Я пытаюсь создать промежуточное программное обеспечение для разных типов пользователей в моем приложении Laravel 5.2. Итак, что я делаю, так это создаю разные промежуточные программы для разных пользователей.

Насколько мне известно, Auth::check() не будет работать без размышлений о промежуточном программном обеспечении из здесь.

Итак, что я сделал, это-

routes.php

Route::group(['middleware' => ['web','admin']], function ()
{
    //suspend, activate, delete
    Route::get('users', [
        'uses'          => 'AdminController@users',
        'as'            => 'users'
    ]);

    //Edit,activate,suspend, delete
    Route::get('articles', [
        'uses'          => 'AdminController@articles',
        'as'            => 'articles'
    ]);
});

AdminMiddleware.php

<?php

namespace App\Http\Middleware;

use Closure;
use Auth;

class AdminMiddleware
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        if (Auth::check())
        {
            return "asd";
            //return Auth::user();
            //return redirect('home');
        }
        else
        {
            return redirect('login');
        }

        //now return the valid request
        return $next($request);
    }
}

Ядро.php

protected $routeMiddleware = [
    'auth'          => \App\Http\Middleware\Authenticate::class,
    'admin'         => \App\Http\Middleware\AdminMiddleware::class,
    'user'          => \App\Http\Middleware\UserMiddleware::class,
    'auth.basic'    => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
    'guest'         => \App\Http\Middleware\RedirectIfAuthenticated::class,
    'throttle'      => \Illuminate\Routing\Middleware\ThrottleRequests::class,
];

AdminController.php

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

use App\Http\Requests;
use App\Http\Controllers\Controller;

class AdminController extends Controller
{
    public function users()
    {
        return view('admin.users');
    }

    public function articles()
    {
        return view('admin.articles');
    }
}

Но я получаю эту ошибку-

введите здесь описание изображения

когда "return Auth::user();" вызывается внутри промежуточного ПО, "return Auth::user();" работает в другом месте (представление и контроллеры), но не работает, как старые версии Laravel.

Кто-нибудь может помочь?


person Abrar Jahin    schedule 04.01.2016    source источник
comment
почему вы пытаетесь вернуть модель пользователя из промежуточного программного обеспечения?   -  person lagbox    schedule 04.01.2016
comment
На самом деле я хочу знать тип пользователя в своем промежуточном программном обеспечении, чтобы я мог решить, что с этим делать, поэтому для тестирования я пытаюсь вернуть все.   -  person Abrar Jahin    schedule 04.01.2016
comment
просто dd то, что вы хотите проверить, не возвращайте их. Что вы пытаетесь проверить на «пользовательской» модели?   -  person lagbox    schedule 04.01.2016
comment
user_type - в пользовательской модели   -  person Abrar Jahin    schedule 04.01.2016
comment
На самом деле проблема не в том, что я возвращаю, проблема в том, что мне не разрешено делать Auth::check()   -  person Abrar Jahin    schedule 04.01.2016
comment
вы можете, и это делается в других промежуточных слоях   -  person lagbox    schedule 04.01.2016
comment
Прокомментируйте строку VerifyCsrfToken в Kernel.php и проверьте.   -  person Gaurav Dave    schedule 04.01.2016
comment
в промежуточном программном обеспечении вы не можете использовать else, просто после окончания, если тело пишет оператор возврата.   -  person sandip bharadva    schedule 19.03.2020


Ответы (4)


Вы могли бы сделать что-то подобное, настроить при необходимости

public function handle($request, Closure $next)
{
    $user = $request->user();

    if (! $user || $user->user_type != 'admin') {
        return redirect('login');
    }

    return $next($request);
}

Ошибка, которую вы получаете, связана с тем, что вы не возвращаете объект Response из своего промежуточного программного обеспечения. Промежуточное ПО VerifyCsrfToken пытается добавить файл cookie к ответу, который он получает при передаче запроса по конвейеру. В этом случае он получает не объект Response, а строку или User, потому что в промежуточном программном обеспечении была возвращена строка или User.

person lagbox    schedule 04.01.2016
comment
У меня на 5.2 работает нормально. кажется, проблема со стеком, который у вас есть, потому что через конвейер не передается правильный объект ответа, но опять же, возврат текста или пользовательского объекта из вашего промежуточного программного обеспечения не поможет вам, он просто будет ломать вещи. - person lagbox; 04.01.2016

Привет @Cowboy и @lagbox, спасибо за попытку помочь, к сожалению, они не работали, но я решил эту проблему.

Я решил это, запустив-

Кэш php-мастера: очистить

композитор дамп-автозагрузка

php ремесленник ясно скомпилирован

php ремесленник оптимизировать

а затем промежуточное ПО-

<?php

namespace App\Http\Middleware;

use Closure;
use Auth;

class AdminMiddleware
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        if (Auth::check())
        {
            if(strcmp( "admin" , Auth::user()->user_type ) != 0 )
                return redirect('home');
            else
                return $next($request);
        }
        else
        {
            return redirect('login');
        }

        //now return the valid request
        //return $next($request);
    }
}

И маршрут-

Route::group(['middleware' => ['web','admin']], function ()
{
    //suspend, activate, delete
    Route::get('users', [
        'uses'          => 'AdminController@users',
        'as'            => 'users'
    ]);

    //Edit,activate,suspend, delete
    Route::get('articles', [
        'uses'          => 'AdminController@articles',
        'as'            => 'articles'
    ]);
});
person Abrar Jahin    schedule 04.01.2016

Вы также добавили маршруты в веб-группу, поэтому убедитесь, что в вашем файле ядра есть следующая группа промежуточного программного обеспечения.

/**
 * The application's route middleware groups.
 *
 * @var array
 */
protected $middlewareGroups = [
    'web' => [
        \App\Http\Middleware\EncryptCookies::class,
        \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
        \Illuminate\Session\Middleware\StartSession::class,
        \Illuminate\View\Middleware\ShareErrorsFromSession::class,
        \App\Http\Middleware\VerifyCsrfToken::class,
    ],

    'api' => [
        'throttle:60,1',
    ],
];

Ошибка из-за сеанса. убедитесь, что ваш файл ядра содержит промежуточное программное обеспечение сеанса.

person Cowboy    schedule 04.01.2016
comment
к OP уже применена группа веб-промежуточного программного обеспечения. если бы они этого не сделали, они бы не получили ошибку промежуточного программного обеспечения csrf, которое предоставляется веб-группой. - person lagbox; 04.01.2016

У меня такая же проблема. В моем случае я сталкиваюсь с этим при множественной аутентификации. Если вы используете множественную аутентификацию или даже одиночную аутентификацию с другим именем первичного ключа в таблице вместо id, это может привести к.

В Laravel первичный ключ по умолчанию для таблицы пользователей — id. В случае, если вы изменили это на user_id или что-то в этом роде, вы должны указать это в своей модели. Если нет, Laravel не сможет создать сеанс для пользователя, в результате Auth::attempt() будет работать нормально, а Auth::check() — нет. Итак, убедитесь, что вы упомянули об этом внутри класса модели.

class User extends Authenticatable {
   $primaryKey = 'user_id';
person PyRu    schedule 27.02.2019