Auth::user() возвращает ноль
Я использую Laravel 5.2 и у меня проблемы с промежуточным ПО. Код в файле ways.php
использовать Illuminate\Contracts\Auth\Access\Gate; Route::group(['middleware' => 'web'], function () { Route:: Auth(); Route::get('/', 'HomeController@index'); }); Route::group(['prefix'=>'admin', 'middleware' => 'admin'], function(){ Route::get('/', function(){ обратный просмотр ('admin.index'); }); Route::get('/user', function(){ обратный просмотр ('admin.user'); }); });
Kernel.php:
protected $ routeMiddleware = [... 'admin' => \ App \ Http \ Middleware \ AdminPanel:: class, ];
AdminPanel.php
Пространство имен App\Http\Middleware; использовать Закрытие; использовать Освещение \ Поддержка \ Фасады \ Auth; использовать приложение \ роль; class AdminPanel {дескриптор публичной функции ($request, Closure $next) { $user = Auth::user(); дд ($ пользователю); if($user){ $role = Role::whereName('admin')->first(); if($user->hasRole($role)){ return $next($request); } } return redirect('/'); }
Так,
$user = Auth::user
()
всегда возвращать ноль. Спасибо за предложения!
9 ответов
Любой маршрут, который использует Auth()
должны быть заключены в web
промежуточное программное обеспечение. Ты рядом, просто двигай Route::group(['prefix' => 'admin'], ...)
в группу выше.
Route::group(['middleware' => 'web'], function () {
Route::auth();
Route::get('/', 'HomeController@index');
// Moving here will ensure that sessions, csrf, etc. is included in all these routes
Route::group(['prefix'=>'admin', 'middleware' => 'admin'], function(){
Route::get('/', function(){
return view('admin.index');
});
Route::get('/user', function(){
return view('admin.user');
});
});
});
Я столкнулся с ситуацией, когда Auth::user()
всегда возвращается null
это было потому, что я пытался получить User
в конструкторе контроллера.
Я понял, что вы не можете получить доступ к аутентифицированному пользователю в конструкторе вашего контроллера, потому что промежуточное программное обеспечение еще не запущено.
В качестве альтернативы вы можете определить промежуточное ПО на основе Closure непосредственно в конструкторе вашего контроллера.
namespace App\Http\Controllers;
use App\User;
use Illuminate\Support\Facades\Auth;
use App\Http\Controllers\Controller;
class ProjectController extends Controller
{
protected $user;
/**
* Create a new controller instance.
*
* @return void
*/
public function __construct()
{
$this->middleware(function ($request, $next) {
$this->user = Auth::user();
return $next($request);
});
}
}
Определите середину в конструкторе вашего контроллера, и здесь он поможет
public function __construct()
{
$this->middleware('auth:api');
}
У меня была такая же проблема, потому что я не установил имя таблицы.
/**
* The table associated with the model.
*
* @var string
*/
protected $table = 'users';
Я нашел решение в старом коде
function getAuth($guard, $get)
{
return auth($guard)->user()->$get;
}
добавьте эту ^ в качестве вспомогательной функции и используйте ее везде, где хотите, например:
getAuth('user', 'id');
Вы можете использовать его вот так.
$this->middleware(function ($request, $next) {
//Your Code Here
return $next($request);
});
Это сработало для меня.
просто включите свое промежуточное ПО аутентификации в вызов
$user = auth('middleware')->user()
Route::middleware('auth:api')->group(function () {
Route::get('/details', 'UserController@details');
});
Мой Auth::user()
возвращение null
в виду, когда
- У меня нет таблицы пользователей в базе данных
- У меня нет поля id в качестве первичного ключа пользователей таблицы