Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 02.07.2017 11:52:13

Middleware не видит пользователя.

Laravel: 5.3

Зарегал пользователя admin. Везде на страницах он определяется:
Auth::check() - true
Auth::user() - данные пользователя
Request::user() - данные пользователя

Создал middleware Admin, и в нём (даже после авторизации) получаю такие результаты:
Auth::check() - false
Auth::user() - null
Request::user() - null

Где я туплю? Направьте, пожалуйста...

Изменено overman (02.07.2017 16:51:29)

Не в сети

#2 02.07.2017 12:08:36

TrueKanonir
Откуда: Ташкент
Сообщений: 221

Re: Middleware не видит пользователя.

По уму, наверное код посредника надо показать

Не в сети

#3 02.07.2017 12:41:47

Re: Middleware не видит пользователя.

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Contracts\Auth\Guard;

class Admin
{
    /**
     * The Guard implementation.
     *
     * @var Guard
     */
    protected $auth;

    /**
     * Create a new filter instance.
     *
     * @param  Guard  $auth
     * @return void
     */
    public function __construct(Guard $auth)
    {
        $this->auth = $auth;
    }
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return response
     */
    public function handle($request, Closure $next)
    {

dd($this->auth->check());

        return $next($request);
    }
}

Изменено overman (02.07.2017 13:57:05)

Не в сети

#4 02.07.2017 14:12:26

Re: Middleware не видит пользователя.

пользователь на реквесте появляется тоже в результате работы миддлварей – если посмотреть в группу миддлварей web, там есть те что отвечают за сессии пользователей в том числе. просто твоя миддлварь отрабатывает слишком рано, до того как сессия будет прочитана из кук и информация об авторизации будет доступна…

Не в сети

#5 02.07.2017 14:47:28

Re: Middleware не видит пользователя.

просто твоя миддлварь отрабатывает слишком рано

Простите, не доходит, как сделать, чтобы она отрабатывала позже...?

Не в сети

#6 02.07.2017 16:46:04

Re: Middleware не видит пользователя.

наверное надо смотреть где и как она подключена. если ты её добавил в группу web, то она должна быть добавлена в конце группы. если задана для маршрута – должна идти после группы web. если назначается через конструктор контроллера – если честно не помню как там определяется порядок их запуска

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

не вижу версии ларавеля в теме, если 5.4 то в файле маршрутов web.php что-то типа

Route::group(['prefix' => 'admin', 'middleware' => 'is_admin'], function() {
    Route::get('/', 'AdminController@index')->name('admin.home');
    …
})

кстати, а почему не хочешь использовать родной функционал контроля доступа?

у меня в случаях когда пользователь просто или админ или нет, доступ в админку даётся через стандартную миддлварь. для этого в app/Providers/AuthServiceProvider.php добавляется в boot() что-то типа

Gate::define('administer', function ($user) {
    return $user->is_admin;
});

и после этого на маршрутах определяется группа с миддлварью can (стандартная для ларавеля):

Route::group(['prefix' => 'admin', 'middleware' => 'can:administer'], function() {
    Route::get('/', 'AdminController@index')->name('admin.home');
    …
})

теперь все маршруты внутри /admin отдают 403 если пользователь авторизован и is_admin == false

Не в сети

#7 02.07.2017 16:57:04

Re: Middleware не видит пользователя.

Laravel: 5.3

В ядре зарегал этот Middleware только в маршрутах. И действительно, если добавить его в группу "web" или же просто как обычный Middleware, то на всех страницах Auth::user() = null.

Создал этот Middleware для SleepingOwl. И прописал в его конфигах 'middleware' => ['admin'],
Как то так(((

Не в сети

#8 02.07.2017 20:16:45

Re: Middleware не видит пользователя.

там сама миддлварь случайно авторизацию не сбрасывает в процессе работы? может там у неё в коде баг?

Не в сети

#9 02.07.2017 21:25:16

Re: Middleware не видит пользователя.

Блин, нет, вроде. Очень странное поведение...
Сейчас взял код всего Middleware из офсайта документации SleepingOwl(весь код ниже). Но один фиг в $auth->user() лежит null. А на страницах Auth::user() определяется. Относительно давно не работал с Laravel, но раньше никогда такого не было...

<?php

namespace App\Http\Middleware;

use App\User;
use Closure;
use Illuminate\Support\Facades\Auth;
class Admin
{
    /**
     * 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)
    {
        $auth = Auth::guard($guard);
dd($auth);
        if (Auth::guard($guard)->guest()) {
            if ($request->ajax() || $request->wantsJson()) {
                return response('Unauthorized.', 401);
            } else {
                return redirect()->guest('login');
            }
        }

        if (! $auth->user()->isAdmin()) {
            return response('Access denied.', 401);
        }

        return $next($request);
    }
}

Не в сети

#10 03.07.2017 05:57:28

Re: Middleware не видит пользователя.

ну да, вроде всё норм. у меня других идей нет – надо ставить точки останова в миддлварях, ходить отладчиком по коду и смотреть что происходит… скорее всего ошибка где-то совсем в другом месте…

Не в сети

#11 03.07.2017 08:50:09

Re: Middleware не видит пользователя.

Проблема решилась созданием отдельной группы middleware - admin. Перенёс туда все middleware из web и добавил туда middleware admin.
И маленький, но ооочень важный нюанс, middleware admin в своей группе\массиве должен обязательно идти после middleware StartSession, в противном случае в пользователе так же будет null.

Надеюсь, кому-то поможет.
Всем спасибо.

Не в сети

#12 03.07.2017 12:37:37

Re: Middleware не видит пользователя.

ну понятное дело, StartSession как раз и отвечает за восстановление авторизации из куки…

Не в сети

#13 15.01.2018 12:28:39

Re: Middleware не видит пользователя.

Коллеги, столкнулся с такой же проблемой на lumen 5.5

Проблема решилась переносом middleware в группу route*Middleware

$app->routeMiddleware([
     'auth'   => App\Http\Middleware\Authenticate::class,
     'access' => App\Http\Middleware\AccessMiddleware::class
]);

И переписыванием вызова посредника из-под маршрутизатора, а не из конструктора контроллера:

$router->group(['middleware' => 'access'], function ($router) {
        $router->get('managerstatistics','Reports\ManagerStatisticsController@Index');
    });

Не в сети

Подвал раздела