![](/img/trans.png)
[英]Laravel 5.6.28: Auth Middleware redirects to Login (handle not called)
[英]Laravel 5 middleware auth always fails and redirects to login
如果憑據正確,我正在驗證我的用戶並將他重定向到儀表板。 我想保護儀表板路由並添加中間件身份驗證,但現在它總是重定向到登錄頁面。
路線.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');
});
});
家庭控制器.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);
}
我不確定為什么您的代碼無法正常工作,但是您可以嘗試替換:
if (Auth::attempt($userdata)) {
$userid = Auth::id();
return redirect()->intended('/');
}
有:
if (Auth::attempt($userdata)) {
$userid = Auth::id();
return redirect('dashboard');
}
創建到先前預定位置的新重定向響應。
返回到上一個位置而不是下一個位置,這給您帶來一些錯誤。
更新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');
}
在$routeMiddleware
數組中的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');
}
希望這可以幫助你。 編碼愉快。 干杯。
很抱歉來晚了,但經過長時間的搜索,我不得不將我的中間件從['middleware' => 'auth]
更改為['middleware' => 'auth:web']
我希望這有幫助
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.