2

我正在验证我的用户并将他重定向到仪表板,如果凭据正确。我想确保仪表板路由并添加中间件身份验证,但现在它总是重定向到登录页面。Laravel 5中间件身份验证总是失败并重定向到登录

routes.php文件

Route::get('login', array('uses' => '[email protected]')); 
Route::post('login', array('uses' => '[email protected]')); 
Route::get('logout', array('uses' => '[email protected]')); 

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

中间件RedirectIfAut henticated.php

public function handle($request, Closure $next, $guard = null) 
{ 
    if (Auth::guard($guard)->check()) { 
     return redirect('/'); 
    } 

    return $next($request); 
} 
+0

看起来像你的会议不持久。您可以在重定向之前通过dd(Auth :: attempt($ userdata))确认。如果值是真的,那么你的会话不能正常工作 – astroanu

+0

我返回dd(Auth :: attempt($ userdata)) - 它给出真正的。我该怎么做才能纠正它 –

+0

搜索“laravel会话不会持续”在谷歌 – astroanu

回答

0

我不知道为什么你的代码不能正常工作,但你可以尝试更换:

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

创建一个新的重定向re响应以前预定的位置。

给您一些错误,因为它将返回到前一个位置而不是下一个位置。


更新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文件中$routeMiddleware阵列:

$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'); 
} 

路由。PHP

Route::get('login', '[email protected]'); 
Route::post('login', '[email protected]'); 
Route::get('logout', '[email protected]'); 

// Replace the dashboard code inside the dashboard method.. 
Route::get('dashboard', '[email protected]'); 

我再次将已经创建了一个称为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'); 
} 

希望这可以帮助你。快乐编码。干杯。

+0

没有..tat没有改变任何东西..同名问题 –

+0

请看** UPDATE 1 **。不知道这是否是你要找的。可能会帮助你。试一试! –

相关问题