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\AuthenticateSession
oprogramowanie 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życiuauth.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!
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.