Laravel身份验证未显示会话消息

4

我正在尝试在Laravel 5.2中验证用户类型。路由如下:

Route::group(['middleware' => ['web']], function(){
    Route::auth();
    Route::get('/user/department/login', ['as' => 'department_login', 'uses' => 'DepartmentUserAuth\AuthController@showLoginForm']);
    Route::post('/user/department/login','DepartmentUserAuth\AuthController@deptLoginPost');

}); 

AuthController.php

public function deptLoginPost(Request $request)
{

    $this->validate($request, [
        'username'      => 'required',
        'password'      => 'required',
    ]);
    if (auth()->guard('department_user')->attempt(['username' => $request->input('username'), 'password' => $request->input('password')]))
    {
        $user = auth()->guard('department_user')->user();
        dd($user);
    }else{
       return redirect('/user/department/login')->with('message', 'Invalid credentials');
    }
}

login.blade.php 是登录页面:

@if(Session::has('message'))
<div class="row">
   <div class="col-lg-12">
         <div class="alert {{ Session::get('alert-class', 'alert-info') }}">
               <button type="button" class="close" data-dismiss="alert">×</button>
               {!! Session::get('message') !!}
         </div>
      </div>
</div>
@endif

{{ dump(session()->all()) }}

但是Session::has('message')为空,并且dump如下所示:
array:3 [▼
  "_token" => "BvQ630KrUl78Ngb8d3cst6pAIqenra3ohbYbLzAP"
  "_previous" => array:1 [▼
    "url" => "http://localhost:8080/material/public/user/department/login"
  ]
  "flash" => array:2 [▼
    "old" => []
    "new" => []
  ]
]

我该如何在我的 login.blade.php 文件中显示所有错误信息(就像默认的身份验证控制器中一样)?

请粘贴您的 config/auth.php 代码。 - Basheer Kharoti
您可以像这样添加消息:$request->request->add(['message' => "您的自定义消息"]);,而无需将其放入会话中。使用 withInput() 重定向回去。 - Rutvij Kothari
4个回答

3
尝试直接在请求的消息上设置消息: $request->session()->flash('message', 'Invalid credentials'); 示例:
if (auth()->guard('department_user')->attempt(['username' => $request->input('username'), 'password' => $request->input('password')]))
{
    $user = auth()->guard('department_user')->user();
    dd($user);
}else{
    $request->session()->flash('message', 'Invalid credentials');
    return redirect()->back();
}

如果仍然没有帮助,请查看您的路由,并检查您的中间件是否正确分配。
// either as a string
Route::group(['middleware' => 'web']...
// or as a array element
Route::group(['middlewareGroups' => ['web']]...

这个更改为什么会对问题产生影响? - alepeino

2
据我所知,这应该是可行的(实际上,我刚刚在一个新的Laravel 5.2安装中尝试了一下,它按预期工作)。我的唯一猜测是,with方法并没有将消息“永久”写入会话中,而是在flash数据中(只在下一个请求周期中可用)。如果由于某种原因,您正在获取重定向响应,则该响应将使用flash数据,在再次到达登录表单时,消息不再位于会话中。

那么,除了AuthController中的重定向之外,您是否还做了任何重定向?也许是在中间件中?

您可以尝试以下几件事情:

  • Add some middleware that logs every request (see, how to log every response in Laravel 5.2 framework) so you can trace if there are additional redirects.

  • Add session()->reflash(); to a middleware that runs with every request. (If this work this should prove my point that the flash data is being consumed in an intermediate request).

  • Replace

    return redirect('/user/department/login')
        ->with('message', 'Invalid credentials');
    

    with

    return redirect()
        ->back()->with('message', 'Invalid credentials');
    
  • Replace (only temporarily, to test you can write and read from the session store)

    return redirect('/user/department/login')
        ->with('message', 'Invalid credentials');
    

    with

     session(['message' => 'Invalid credentials']);
     return redirect('/user/department/login');
    

1
据我所知,routes.php 文件中的路由默认已经使用了 web 中间件,因此无需再次包装。 Route::auth() 使用的是 Laravel 默认的身份验证路由,也许您与部门登录路由有冲突,因此请尝试删除该行。
最后,我建议您使用 session()->flash('message', 'Invalid credentials'); 而不是 ->with()

1
此外,还可以使用 Session 门面:
//display error message
Session::flash('message', 'Invalid credentials')

//color the output
Session::flash('alert-class', 'alert-danger')

或者,使用laracasts/flash,你可以:

//AuthController
flash('Invalid credentials')->error();

//login.blade.php
@include('flash::message')

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接