Filament 5 має вбудовану багатофакторну автентифікацію (MFA) з двома провайдерами: застосунок-автентифікатор (TOTP-коди, Google Authenticator, 1Password) і коди на email.
Застосунок-автентифікатор:
Schema::table('users', function (Blueprint $table) {
$table->text('app_authentication_secret')->nullable();
$table->text('app_authentication_recovery_codes')->nullable();
});
use Filament\Auth\MultiFactor\App\Concerns\InteractsWithAppAuthentication;
use Filament\Auth\MultiFactor\App\Concerns\InteractsWithAppAuthenticationRecovery;
use Filament\Auth\MultiFactor\App\Contracts\HasAppAuthentication;
use Filament\Auth\MultiFactor\App\Contracts\HasAppAuthenticationRecovery;
class User extends Authenticatable implements FilamentUser, HasAppAuthentication, HasAppAuthenticationRecovery
{
use InteractsWithAppAuthentication;
use InteractsWithAppAuthenticationRecovery;
}
use Filament\Auth\MultiFactor\App\AppAuthentication;
$panel->multiFactorAuthentication([
AppAuthentication::make()->recoverable(),
], isRequired: true);
Користувачі налаштовують MFA на сторінці профілю, тож у панелі має бути ввімкнено ->profile(). isRequired: true змушує налаштувати MFA перед роботою з панеллю. recoverable() дає 8 кодів відновлення на випадок втрати телефона.
Важливі деталі:
- трейт додає секрету каст
encryptedі ховає його із серіалізації. Секрет зашифровано ключемAPP_KEY: якщо змінити ключ безAPP_PREVIOUS_KEYS, усі налаштовані автентифікатори перестануть працювати; - коди відновлення одноразові - використаний код видаляється, а нові користувач генерує в профілі;
- перевірка MFA відбувається до входу в систему, тож окремий middleware на маршрути панелі не потрібен.
Обмеження, про які варто пам'ятати:
- MFA захищає лише вхід через панель. Якщо застосунок має власний вхід (сайт, API), користувач, авторизований там, відкриє панель без другого фактора, якщо MFA для нього вже налаштовано, але не вимагається повторно;
- email-коди слабші за застосунок: захищеність дорівнює захищеності поштової скриньки;
- адміністраторам із доступом до чутливих даних MFA варто робити обов'язковою, а не опційною.