Laravel 5: Как сохранить дополнительные атрибуты для сеанса входа пользователя

Я фактически внедряю двухфакторную аутентификацию в проект. Что я сделал

Auth::user()->google2fa_passed = 1;

На самом деле он не сохраняет, при переходе на другую страницу значение отсутствует.

Я также не хочу продолжать сеанс, потому что когда пользователь выходит из системы (или пользователи удаляют сессионный cookie из своего браузера), затем покажет страницу входа в систему и снова пройдёт 2-х факторную аутентификацию.

Любая идея, как сохранить еще 1 атрибут для пользовательской сессии?

6

Решение

Когда вы используете Auth::user() это дает вам модель Eloquent аутентифицированного пользователя.

Если вы хотите хранить данные в сеансе, вам нужно использовать Session фасад или session() помощник.

Вы можете найти больше информации о сессии в документации.

PS: старая версия документации лучше (http://laravel.com/docs/5.0/session).

3

Другие решения

В конце концов, я использую session хранить.

После ввода 6-значного кода сохраните флаг в сеансе

\Session::put('totp_passed', 1);

В приложение / Http / Промежуточный / Authenticate.php, удалить 2FA сессия если сессия истекла

public function handle($request, Closure $next)
{
if ($this->auth->guest()) {
// remove the 2-factor auth if the user session expired
\Session::forget('totp_passed'); // <------- add this line

if ($request->ajax()) {
return response('Unauthorized.', 401);
} else {
return redirect()->route('auth.login');
}
}
return $next($request);
}

Затем создайте другое промежуточное программное обеспечение, например приложение / Http / Промежуточный / TwoFactorAuth.php

namespace App\Http\Middleware;

use Closure;

class TwoFactorAuth
{
/**
* Handle an incoming request.
*
* @param  \Illuminate\Http\Request  $request
* @param  \Closure  $next
* @return mixed
*/
public function handle($request, Closure $next)
{
if (!\Session::has('totp_passed')) {
return redirect()->route('auth.2fa');
}

return $next($request);
}
}

В приложение / Http / Kernel.php

protected $routeMiddleware = [
'auth'       => \App\Http\Middleware\Authenticate::class,
'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
'guest'      => \App\Http\Middleware\RedirectIfAuthenticated::class,
'2fa'        => \App\Http\Middleware\TwoFactorAuth::class, // <------ add this line
];

Как пользоваться

Route::group(['middleware' => 'auth'], function () {
// must be login first only can access this page
Route::get('2fa', ['as' => 'auth.2fa', 'uses' => 'Auth\AuthController@get2FactorAuthentication']);
Route::post('2fa', ['uses' => 'Auth\AuthController@post2FactorAuthentication']);

// add 2-factor auth middleware
Route::group(['middleware' => '2fa'], function () {
// all routes that required login
});
});
2

По вопросам рекламы [email protected]