Проверка подлинности промежуточного программного обеспечения Laravel 5 всегда дает сбой и перенаправляет на вход

Я аутентифицирую своего пользователя и перенаправляю его на панель управления, если учетные данные верны. Я хочу защитить маршрут панели управления и добавить аутентификацию промежуточного ПО, но теперь он всегда перенаправляется на страницу входа.

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

person Stacy J    schedule 30.12.2015    source источник
comment
похоже, что ваш сеанс не сохраняется. вы можете подтвердить это с помощью dd (Auth :: try ($ userdata)) перед перенаправлением. если значение истинно, значит ваши сеансы работают некорректно   -  person astroanu    schedule 30.12.2015
comment
Я вернул dd (Auth :: try ($ userdata)) - это правда ... что мне делать, чтобы исправить это   -  person Stacy J    schedule 30.12.2015
comment
поиск сеанса laravel, не сохраняющегося в Google   -  person astroanu    schedule 30.12.2015


Ответы (1)


Я не уверен, почему ваш код не работает, но вы можете попробовать заменить:

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

Зарегистрируйте его в 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 __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');
}

Надеюсь, что это помогает вам. Удачного кодирования. Ваше здоровье.

person Saiyan Prince    schedule 30.12.2015
comment
Пожалуйста, ознакомьтесь с ОБНОВЛЕНИЕМ 1. Не уверен, что это то, что вы ищете. Может быть, это может вам помочь. Дать ему шанс! - person Saiyan Prince; 30.12.2015