【问题标题】:Auth::user() returns nullAuth::user() 返回 null
【发布时间】:2016-05-11 15:39:02
【问题描述】:

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

使用 Illuminate\Contracts\Auth\Access\Gate; Route::group(['middleware' => 'web'], function () { 路线::auth(); Route::get('/', 'HomeController@index'); }); Route::group(['prefix'=>'admin', 'middleware' => 'admin'], function(){ 路线::get('/', function(){ 返回视图('admin.index'); }); 路由::get('/user', function(){ 返回视图('admin.user'); }); });

内核.php:

受保护的 $routeMiddleware = [ ... 'admin' => \App\Http\Middleware\AdminPanel::class, ];

AdminPanel.php

命名空间应用\Http\中间件; 使用闭包; 使用 Illuminate\Support\Facades\Auth; 使用应用\角色; 类管理面板 { 公共函数句柄($request, Closure $next) { $user = Auth::user(); dd($用户); 如果($用户){ $role = Role::whereName('admin')->first(); if($user->hasRole($role)){ 返回 $next($request); } } 返回重定向('/'); }

所以,

$user = Auth::user()
总是返回 null。 感谢您的建议!

【问题讨论】:

    标签: php authentication laravel-5 middleware


    【解决方案1】:

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

    【讨论】:

    • 在我的例子中,我创建了一个自定义路由文件作为 routes/admin.php 并将其挂接到 RouteServiceProvider.php 的 boot() 方法中。因为我想让 Auth::user() 在我的中间件中工作,我需要将 web 作为数组的 first 元素传递给中间件链接。即Route::prefix('admin')->middleware(['web', 'admin'])->namespace($this->namespace)>group(base_path('routes/admin.php'));。传递第一个元素很重要,因为它不会作为第二个元素。
    【解决方案2】:

    我遇到了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);
            });
        }
    }
    

    【讨论】:

    • 这样就解决了我的问题,我把所有的过程都放在了中间件回调里面;
    【解决方案3】:

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

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

    【讨论】:

    • 非常感谢,我花了很多时间来解决这个问题。过去我为每个模型添加了表格属性
    【解决方案4】:

    我的Auth::user() 返回null 何时可见

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

    【讨论】:

      【解决方案5】:
      Route::middleware('auth:api')->group(function () {
          Route::get('/details', 'UserController@details');
      });
      

      【讨论】:

      • middleware('auth:api') 只支持api请求
      【解决方案6】:

      在你的控制器的构造器中定义中间件,它会在这里解决问题

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

      【讨论】:

        【解决方案7】:

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

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

        【讨论】:

          猜你喜欢
          • 2023-02-04
          • 1970-01-01
          • 2017-03-17
          • 1970-01-01
          • 2019-09-20
          • 2016-05-13
          • 2021-01-02
          • 2020-08-14
          • 2017-06-29
          相关资源
          最近更新 更多