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 中间件身份验证总是失败并重定向到登录的主要内容,如果未能解决你的问题,请参考以下文章

如果用户未使用中间件进行身份验证,Laravel 5.4 将重定向到特定页面

如何使用 Laravel 5.3 注销并重定向到登录页面?

Laravel 7 手动身份验证会话问题

Laravel 5.6 上的 Ajax 身份验证重定向

如果在 Laravel 5.3 中通过身份验证,则重定向

Laravel 5.3 + Passport:总是未经身份验证的错误