• Czas czytania ~3 min
  • 03.07.2023

Ostatnio skradziono mi telefon komórkowy i zdałem sobie sprawę, jak wiele aplikacji nie ma funkcji kontroli sesji. Nie mogę wylogować się z tego urządzenia.

Na szczęście Laravel umożliwia unieważnienie i "wylogowanie" sesji aktywnego użytkownika na innych urządzeniach bez unieważniania sesji na jego bieżącym urządzeniu.

Poniżej wymieniam kilka przypadków, w których ta funkcja może być pomocna:

  • Użytkownik zgubi lub zostanie skradzione jego urządzenie.
  • Użytkownik zmienia hasło.
  • Aplikacja nie może zezwalać na wiele sesji jednocześnie.

Unieważnianie sesji na innych urządzeniach Aby unieważnić sesję użytkownika na wszystkich urządzeniach

z wyjątkiem bieżącej, musisz wywołać metodę Auth::logoutOtherDevices . Wymaga od użytkowników potwierdzenia hasła.

Jest to ważne, ponieważ jeśli użytkownik zgubił lub skradził telefon komórkowy, nie można zezwolić komuś na wylogowanie się ze wszystkich sesji za pomocą tego urządzenia.

use Illuminate\Support\Facades\Auth;
Auth::logoutOtherDevices($currentPassword);

Aby metoda działała logoutOtherDevices , Laravel dostarcza Illuminate\Session\Middleware\AuthenticateSessionoprogramowanie pośredniczące, które wykrywa zmiany skrótu hasła, natychmiast wylogowuje użytkownika i uruchamia Illuminate\Auth\Events\CurrentDeviceLogout zdarzenie.

Domyślnie AuthenticateSession oprogramowanie pośredniczące może być dołączone do trasy przy użyciu auth.session aliasu oprogramowania pośredniczącego trasy zdefiniowanego w jądrze HTTP aplikacji
Oficjalna dokumentacja

routes/web.php

Route::middleware(['auth', 'auth.session'])->group(function () {
    Route::get('/', function () {
        // ...
    });
});

LaravelWtedy możesz już myśleć o tym, co robi.logoutOtherDevices Ponownie odszyfrowuje hasło. Huh, ale czy hash zmienia się nawet przy użyciu tego samego hasła? Tak!

Laravel Hash::make() objaśnienie

Unieważnianie sesji określonego urządzenia

Jest to możliwe, ale sesje należy zarządzać za pomocą sterownika bazy danych. Umożliwia to wysyłanie zapytań do sesji i wyświetlanie listy użytkownikowi, aby wybrać określoną sesję do unieważnienia.

Sterownik bazy danych wymaga tabeli. Możesz użyć session:table polecenia artisan, aby wygenerować tę migrację.

php artisan session:table
php artisan migrate

Ustaw sterownik w pliku jako atrybut database:Or via w config/session.php pliku env:Następnie utwórz model dla sesji tabela:Utwórz relacje:Teraz możesz wyświetlić listę sesji:Przykład tego, jak powinien wyglądać:

//...
'driver' => env('SESSION_DRIVER', 'database')
//...

SESSION_DRIVER=database

php artisan make:model Session

config/session.php

namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
class Session extends Model
{
    public $incrementing = false;
    public function user(): BelongsTo
    {
        return $this->belongsTo(User::class);
    }
}

namespace App\Models;
//...
use Illuminate\Database\Eloquent\Relations\HasMany;
class User extends Authenticatable
{
    //...
    public function sessions(): HasMany
    {
        return $this->hasMany(Session::class);
    }
}

$user = auth()->user();
$sessions = $user->sessions()
    ->select('id', 'ip_address', 'user_agent', 'last_activity')
    ->get();
dump($sessions->toArray());

array:3 [▼ // routes/web.php:18
  0 => array:4 [▶
    "id" => "J9KBJgsqKWRu4JGhNpTF73EBhGXD9FneIR2vzEqX"
    "ip_address" => "217.240.75.140"
    "user_agent" => "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) ..."
    "last_activity" => 1688043153
  ]
  1 => array:4 [▶
    "id" => "mfmRbbeR803hPpi0uLlPYtWaahqgw6CglEu5UMv7"
    "ip_address" => "21.51.178.175"
    "user_agent" => "Mozilla/5.0 (iPhone; CPU iPhone OS 11_6_9; like Mac OS X) ..."
    "last_activity" => 1688043136
  ]
  2 => array:4 [▶
    "id" => "VCkIFZN0zjKq808gvps7haz8XzOkOjnxVlZQifwe"
    "ip_address" => "25.31.180.18"
    "user_agent" => "Mozilla / 5.0 (compatible; MSIE 8.0; Windows; U; Windows NT 10.0; WOW64; en-US Trident / 4.0)"
    "last_activity" => 1688043145
  ]
]

Na koniec, aby zniszczyć określoną sesję, musisz usunąć ją z bazy danych.SESSION_DRIVER W poniższym przykładzie odłączamy iPhone'a:

$user->sessions()
    ->where('id', 'mfmRbbeR803hPpi0uLlPYtWaahqgw6CglEu5UMv7')
    ->delete();

W zamknięciu

W tym poście dowiedziałeś się, jak ważna jest kontrola sesji na urządzenie i jak można to osiągnąć za pomocą Laravel.

Comments

No comments yet
Yurij Finiv

Yurij Finiv

Full stack

O

Professional Fullstack Developer with extensive experience in website and desktop application development. Proficient in a wide range of tools and technologies, including Bootstrap, Tailwind, HTML5, CSS3, PUG, JavaScript, Alpine.js, jQuery, PHP, MODX, and Node.js. Skilled in website development using Symfony, MODX, and Laravel. Experience: Contributed to the development and translation of MODX3 i...

O autorze CrazyBoy49z
WORK EXPERIENCE
Kontakt
Ukraine, Lutsk
+380979856297