簡體   English   中英

Laravel 5 中間件驗證總是失敗並重定向到登錄

[英]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');
}

預期方法API文檔中

創建到先前預定位置的新重定向響應。

返回到上一個位置而不是下一個位置,這給您帶來一些錯誤。


更新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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM