Laravel 5 中间件身份验证总是失败并重定向到登录
Posted
技术标签:
【中文标题】Laravel 5 中间件身份验证总是失败并重定向到登录【英文标题】:Laravel 5 middleware auth always fails and redirects to login 【发布时间】:2016-04-04 06:53:47 【问题描述】:如果凭据正确,我正在验证我的用户并将他重定向到仪表板。我想保护仪表板路由并添加中间件身份验证,但现在它总是重定向到登录页面。
Routes.php
Route::get('login', array('uses' => 'HomeController@showLogin'));
Route::post('login', array('uses' => 'HomeController@doLogin'));
Route::get('logout', array('uses' => 'HomeController@doLogout'));
Route::group(['middleware' => 'auth'], function()
Route::get('/', function ()
return view('dashboard');
);
Route::get('dashboard', function ()
return view('dashboard');
);
);
HomeController.php
public function showLogin()
return View::make('login');
public function doLogin(Request $request)
$rules = array(
'email' => 'required|email',
'password' => 'required|alphaNum|min:3'
);
$validator = Validator::make($request::all(), $rules);
if ($validator->fails())
return Redirect::to('login')
->withErrors($validator)
->withRequest($request::except('password'));
else
$userdata = array(
'email' => $request::get('email'),
'password' => $request::get('password')
/*'password' => Hash::make($request::get('password'))*/
);
if (Auth::attempt($userdata))
$userid = Auth::id();
return redirect()->intended('/');
else
return Redirect::to('login');
public function doLogout()
Auth::logout();
return Redirect::to('login');
中间件Authenticate.php
public function handle($request, Closure $next, $guard = null)
if (Auth::guard($guard)->guest())
if ($request->ajax())
return response('Unauthorized.', 401);
else
return redirect()->guest('login');
return $next($request);
中间件RedirectIfAuthenticated.php
public function handle($request, Closure $next, $guard = null)
if (Auth::guard($guard)->check())
return redirect('/');
return $next($request);
【问题讨论】:
您的会话似乎没有持续。您可以在重定向之前通过 dd(Auth::attempt($userdata)) 确认。如果该值为 true,那么您的会话工作不正常 我返回了 dd(Auth::attempt($userdata)) - 它给出了真实的..我该怎么做才能纠正它 在 google 上搜索“laravel session not persisting” 【参考方案1】:很抱歉迟到了,但经过长时间的搜索,我不得不将我的中间件从 ['middleware' => 'auth]
更改为 ['middleware' => 'auth:web']
希望对你有帮助
【讨论】:
【参考方案2】:我不确定您的代码为什么不起作用,但您可以尝试替换:
if (Auth::attempt($userdata))
$userid = Auth::id();
return redirect()->intended('/');
与:
if (Auth::attempt($userdata))
$userid = Auth::id();
return redirect('dashboard');
来自API Docs of intended method:
创建一个新的重定向响应到以前的预期位置。
在返回上一个位置而不是下一个位置时给您一些错误。
更新 1:
我会采用以下方法。
制作你自己的名为UserAlreadyLoggedIn
的中间件
php artisan make:middleware UserAlreadyLoggedIn
打开UserAlreadyLoggedIn.php
并使用以下代码更新句柄方法:
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
if(auth()->check())
return $next($request);
return redirect('login');
在app/Http/Kernel.php
数组中的app/Http/Kernel.php
文件中注册它:
$routeMiddleware = [
'user_already_logged_in' => \App\Http\Middleware\UserAlreadyLoggedIn::class,
];
通过UserSessionsController
分隔控制器中已经登录的用户
php artisan make:controller UserSessionsController --plain
在UserSessionsController
内放置__constructor
方法:
/**
* Check if the user is already logged in.
*
* @return void
*/
public function __construct()
$this->middleware('user_already_logged_in');
routes.php
Route::get('login', 'HomeController@showLogin');
Route::post('login', 'HomeController@doLogin');
Route::get('logout', 'HomeController@doLogout');
// Replace the dashboard code inside the dashboard method..
Route::get('dashboard', 'UserSessionsController@dashboard');
我将再次创建一个名为 UserIsAGuest
的中间件,并替换 handle
方法中的 if
块:
if(auth()->guest())
return $next($request);
return redirect('dashboard');
然后在HomeController
的__construct
方法里面:
/**
* Check if the user is already logged in.
*
* @return void
*/
public function __construct()
// Register the middleware in Kernel.php file
$this->middleware('user_is_guest');
希望这对您有所帮助。快乐编码。干杯。
【讨论】:
请查看 UPDATE 1。不确定这是否是您正在寻找的。也许这可以帮助你。试一试!以上是关于Laravel 5 中间件身份验证总是失败并重定向到登录的主要内容,如果未能解决你的问题,请参考以下文章