Laravel 5中间件身份验证始终失败并重定向到登录

时间:2015-12-30 09:57:47

标签: laravel authentication laravel-5.1 laravel-middleware laravel-authorization

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

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

1 个答案:

答案 0 :(得分: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

  

为之前预期的位置创建新的重定向响应。

给你一些错误,因为它回到了之前的位置而不是下一个位置。

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

<强> 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的中间件,并且已经替换了if方法中的handle块:

if(auth()->guest()) {
    return $next($request);
}
return redirect('dashboard');

然后在HomeController&#39; __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');
}

希望这会帮助你。快乐的编码。欢呼声。