Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Страницы 1
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)
Не в сети
По уму, наверное код посредника надо показать
Не в сети
<?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)
Не в сети
пользователь на реквесте появляется тоже в результате работы миддлварей – если посмотреть в группу миддлварей web, там есть те что отвечают за сессии пользователей в том числе. просто твоя миддлварь отрабатывает слишком рано, до того как сессия будет прочитана из кук и информация об авторизации будет доступна…
Не в сети
просто твоя миддлварь отрабатывает слишком рано
Простите, не доходит, как сделать, чтобы она отрабатывала позже...?
Не в сети
наверное надо смотреть где и как она подключена. если ты её добавил в группу 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
Не в сети
Laravel: 5.3
В ядре зарегал этот Middleware только в маршрутах. И действительно, если добавить его в группу "web" или же просто как обычный Middleware, то на всех страницах Auth::user() = null.
Создал этот Middleware для SleepingOwl. И прописал в его конфигах 'middleware' => ['admin'],
Как то так(((
Не в сети
там сама миддлварь случайно авторизацию не сбрасывает в процессе работы? может там у неё в коде баг?
Не в сети
Блин, нет, вроде. Очень странное поведение...
Сейчас взял код всего 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);
}
}
Не в сети
ну да, вроде всё норм. у меня других идей нет – надо ставить точки останова в миддлварях, ходить отладчиком по коду и смотреть что происходит… скорее всего ошибка где-то совсем в другом месте…
Не в сети
Проблема решилась созданием отдельной группы middleware - admin. Перенёс туда все middleware из web и добавил туда middleware admin.
И маленький, но ооочень важный нюанс, middleware admin в своей группе\массиве должен обязательно идти после middleware StartSession, в противном случае в пользователе так же будет null.
Надеюсь, кому-то поможет.
Всем спасибо.
Не в сети
ну понятное дело, StartSession как раз и отвечает за восстановление авторизации из куки…
Не в сети
Коллеги, столкнулся с такой же проблемой на 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');
});
Не в сети
Страницы 1