Laravel 5.5: последний логин и последний логин IP не должны обновляться при успешном входе
Я использую laravel 5.5, хочу записать последний логин (дату и время) и последний логин IP на каждом успешном входе в систему. Но он не обновляется.
LoginController:
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\AuthenticatesUsers;
use Illuminate\Http\Request;
class LoginController extends Controller
{
use AuthenticatesUsers;
protected function authenticated(Request $request, $user)
{
$user->update([
'last_login_at' => Carbon::now()->toDateTimeString(),
'last_login_ip' => $request->getClientIp()
]);
}
}
Модель пользователя:
protected $fillable = [
'first_name','last_name', 'email', 'password','phone','user_type','last_login_at',
'last_login_ip',
];
2 ответа
Запись информации о последнем входе в систему полезна, и вы можете легко сохранить и обновить время последнего входа в систему и IP-адрес клиента.
Вы можете достичь этого несколькими способами, но я покажу вам очень простую и эффективную технику, просто добавьте метод, показанный ниже, в контроллер входа в систему.
function authenticated(Request $request, $user)
{
$user->last_login = Carbon::now()->toDateTimeString();
$user->last_login_ip = $request->getClientIp();
$user->save();
}
Вы импортировали углеродную упаковку?
В любом случае, чтобы реализовать это, я думаю, https://laravel.com/docs/5.7/events - это элегантный способ.
Внутри приложения \Providers\EventServiceProvider.php напишите ниже код
protected $listen = [
'Illuminate\Auth\Events\Login' => [
'App\Listeners\LogSuccessfulLogin',
],
];
Создать приложение Listener Inside \ Listeners \ LogSuccessfulLogin.php
namespace App\Listeners;
use Illuminate\Auth\Events\Login;
class LogSuccessfulLogin {
/**
* Create the event listener.
*
* @return void
*/
public function __construct(){
}
/**
* Handle the event.
*
* @param Login $event
* @throws \Exception
*/
public function handle(Login $event){
$user = $event->user;
$user->last_login_ip = request()->getClientIp();
$user->save();
}
}
Просто обновите дескриптор (), как вы хотите. Импортируйте углеродный пакет здесь и обновите last_login_at.
Если вы хотите записать последний визит пользователя, сначала запустите эту команду
php artisan make:middleware LastVisit
Затем добавьте эту строку в конец массива middlewareGroups (App\Http\Kernel.php)
\App\Http\Middleware\LastVisit::class,
Наконец, измените ваше промежуточное ПО LastVisit. (Я предполагаю, что у вас есть столбец last_visit в вашей таблице пользователей)
<?php
namespace App\Http\Middleware;
use Carbon\Carbon;
use Closure;
use Illuminate\Support\Facades\Auth;
class LastVisit
{
/**
* 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);
}
$user = Auth::User();
$user->timestamps = false;
$user->last_visit = Carbon::now()->toDateTimeString();
$user->save();
return $next($request);
}
}
Это работает с токеном и логинами в социальных сетях.