php Auth::user()返回空值

0vvn1miw  于 2023-02-07  发布在  PHP
关注(0)|答案(8)|浏览(208)

我使用Laravel 5.2,中间件有问题,routes.php中有代码

use 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(){
            return view('admin.index');
        });
        Route::get('/user', function(){
            return view('admin.user');
        });
    });

Kernel.php:

protected $routeMiddleware = [
    ...
     'admin' => \App\Http\Middleware\AdminPanel::class,
    ];

AdminPanel.php

namespace App\Http\Middleware;

    use Closure;
    use Illuminate\Support\Facades\Auth;
    use App\Role;

    class AdminPanel
    {
        public function handle($request, Closure $next)
        {
            $user = Auth::user();
            dd($user);

            if($user){
                $role = Role::whereName('admin')->first();
                if($user->hasRole($role)){
                    return $next($request);
                }
            }
            return redirect('/');
        }

所以,

$user = Auth::user
()

始终返回null。谢谢您的建议!

9lowa7mx

9lowa7mx1#

我遇到过Auth::user()总是返回null的情况,这是因为我试图在控制器的构造函数中获取User
我意识到您不能在控制器的构造函数中访问经过身份验证的用户,因为中间件还没有运行。
或者,您可以直接在控制器的构造函数中定义基于闭包的中间件。

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);
        });
    }
}
zxlwwiss

zxlwwiss2#

任何使用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');
        });
    });
});
vfh0ocws

vfh0ocws3#

在控制器的构造器中定义中间件,它将在这里起作用

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

blpfk2vs4#

我遇到了同样的问题,因为我没有设置表名。

/**
 * The table associated with the model.
 *
 * @var string
 */
protected $table = 'users';
vwoqyblh

vwoqyblh5#

我在一个古老的密码里找到了答案

function getAuth($guard, $get)
{
    return auth($guard)->user()->$get;
}

添加这个^作为一个辅助函数,并在任何你想要的地方使用它,例如:

getAuth('user', 'id');
hk8txs48

hk8txs486#

只需在调用中包含身份验证中间件

$user = auth('middleware')->user()
gpnt7bae

gpnt7bae7#

Route::middleware('auth:api')->group(function () {
    Route::get('/details', 'UserController@details');
});
mnemlml8

mnemlml88#

我的Auth::user()在视图中返回null

  • 数据库中没有users
  • 我没有id字段作为表users的主键

相关问题