Laravel входа пользователя сразу после входа в систему - PullRequest
0 голосов
/ 11 октября 2019

Мой код

У меня есть следующие маршруты в Laravel 5.8.

Единственные общедоступные маршруты, должны быть /login.

//web.php

Route::get('/login', function() {
    return view('auth.login', ['loginRequested' => false]);
})->name('login');
Route::post('/login', 'Auth\LoginController@login')->name('process-login');
Route::get('/login/{loginKey}/{loginHash}', 'Auth\LoginController@authenticate');

Route::group(['middleware' => ['auth']], function() {
    Route::get('/', function () {
        return view('welcome');
    });
    Route::get('/logout', 'Auth\LoginController@logout');
});

У меня тогда естьследующий код аутентификации:

// LoginController.php
/**
 * @param string $loginKey
 * @param string $loginHash
 * @param UsersRepository $usersRepository
 * @param ThirdPartyConnect $thirdParty
 * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector
 */
public function authenticate(string $loginKey, string $loginHash, UsersRepository $usersRepository, ThirdPartyConnect $thirdParty)
{
    try {
        $user = $usersRepository->findUserByHash($loginKey);
        if (md5($user->user_email) !== $loginHash) {
            throw new \Exception('Invalid login hash', 403);
        }

        Auth::login($user);
        $user->details = $thirdParty->getUserDetails($user->user_email);
        Auth::setUser($user);
        return \redirect($this->redirectTo);
    } catch (\Exception $e) {
        return \redirect('login');
    }
}

Что я ожидаю

Когда я вхожу, он должен перенаправиться на мой $this->redirectTo, где я должен иметь доступ к объекту пользователя через Auth::user().

Что он делает

Когда я вхожу, он перенаправляет на /login. Если я дам дамп пользователю после вызова $user->details, у него будет вся необходимая информация о пользователе. Он не генерирует исключение (я добавил dd($e) в части catch для authenticate.

Кажется, он также неправильно устанавливает время сеанса. Если я проверяю cookie в chrome,дата истечения срока действия - это текущая дата / время, а не текущая дата / время + 30 минут в соответствии с файлом конфигурации.

Вопрос

Как это исправить? что-то настроено неправильно? Почему он перенаправляет обратно на /login, а не $this->redirectTo, как ожидалось?

1 Ответ

0 голосов
/ 11 октября 2019

Итак, обнаружена проблема.

Первичный ключ моей таблицы пользователей: user_id.

В моей модели не установлен этот первичный ключ. Поэтому я предполагаю, что он не знал, кто вошел в систему и уничтожил сеанс.

Я добавил это в свою User модель:

protected $primaryKey = 'user_id';

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...