【问题标题】:I get Auth::user is null in Laravel我在 Laravel 中得到 Auth::user 为空
【发布时间】:2016-05-23 18:11:06
【问题描述】:

我使用以下代码为管理员角色创建中间件:

php artisan make:middleware AdminMiddleware

之后,我为登录页面创建了一个路由:

Route::get('admin/login', ['middleware'=>'web','as'=>'admin.login','uses'=>'AdminController@loginView']);
Route::post('admin/login',['middleware'=>'web','as'=>'admin.login','uses'=>'AdminController@login']);
Route::group(['prefix'=>'admin','middleware' => ['auth.admin','web']],     function()
{
    Route::get('/', ['as'=>'admin.home','uses'=>'AdminController@index']);
    Route::get('/home',    ['as'=>'admin.home','uses'=>'AdminController@index']);
});

控制器是

class AdminController extends Controller
{
    //
    function index(){
        return 'welcome';
    }

    function loginView(){
        return view('admin.login');
    }

    function login(Request $request){
        $error = $this->validate($request, [
            'email' => 'required|email',
            'password' => 'required|min:5',
        ]);
        $email = $request->input('email');
        $password = $request->input('password');
        $remember = $request->input('remember');

        if (Auth::attempt(['email' => $email, 'password' => $password,'type'=>'admin'], $remember)) {

            // Authentication passed...
            Auth::login(Auth::user(), $remember);
            return redirect()->route('admin.home');
        }
        else{//('message', 'Login Failed')
            return redirect()->route('admin.login')->withErrors($request->all(), "message")->withInput();
        }
    }
}

在 AdminMiddleware 中

public function handle($request, Closure $next)
{
    var_dump(Auth::user());
    if(!Auth::check()){
        return redirect()->route('admin.login')->withErrors('You are not logged in');
    }
    elseif ($request->user()->type != 'admin'){
        dd($request->user());
        return redirect()->route('admin.login')->withErrors('You have not authority');
    }
    return $next($request);
}

错误是:对于 AdminMiddleware 中的每个 $request->user() 或 Auth:user,我总是得到 null。

【问题讨论】:

  • 您是否创建了迁移?
  • 是的,我已经创建并运行迁移

标签: php laravel authentication laravel-5


【解决方案1】:

您将中间件传递给路由组的顺序不正确。

现在你有这个命令['auth.admin', 'web'],这意味着auth.admin中间件将在web组的中间件之前执行,并且由于web包含StartSession中间件,你不会有auth.admin 中的任何会话都是获取经过身份验证的用户所需的。

所以只需像这样切换中间件顺序:

Route::group(['prefix'=>'admin','middleware' => ['web', 'auth.admin']], function () {
    // now the session is set up in `web` and then you have it in `auth.admin`
});

【讨论】:

    【解决方案2】:

    在我的情况下,实际问题是 PHP 起始标记之前的空行。

    我使用以下核心 PHP 函数进行重定向,而不是从控制器返回视图文件或使用 Laravel 重定向。

    header('Location: /');
    

    它打印了具有空行的实际文件。删除此行解决了我的问题。

    我的代码库中有数千个文件。我的假设是我尝试了不同的脚本来在任何文件的开头找到这样的空行,并且根据这些脚本结果没有这样的文件。我认为我的任何文件中都没有空行。但是 header('Location: /') 证明我的假设没有错,而且我在错误的行上工作。

    【讨论】:

      猜你喜欢
      • 2017-03-29
      • 2016-04-02
      • 2018-08-11
      • 2021-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-27
      • 2017-04-30
      相关资源
      最近更新 更多