Notifikácie
Všetky notifikácie dedia od AuthenticationNotification a posielajú sa e-mailom. Pre guard ich nahradíte cez notifications.classes.<type> (podtrieda AuthenticationNotification), alebo nastavením na null vypnete:
| Typ | Trieda | Príjemca |
|---|---|---|
magic_link | MagicLinkNotification | účet |
email_otp | EmailOtpNotification | účet (kódy na prihlásenie aj opätovné overenie) |
verify_email | VerifyEmailNotification | účet |
reset_password | ResetPasswordNotification | účet |
password_changed | PasswordChangedNotification | účet (zmena, obnova, nastavenie) |
email_change_confirmation | ConfirmEmailChangeNotification | nová adresa |
email_change_requested | EmailChangeRequestedNotification | stará adresa |
email_changed | EmailChangedNotification | stará adresa |
account_exists | AccountExistsNotification | už používaná adresa (jazyk jej držiteľa) |
invitation | InvitationNotification | pozvaný (jazyk pozvánky) |
new_device | NewDeviceLoginNotification | účet |
two_factor_enabled / two_factor_disabled | TwoFactorEnabledNotification / TwoFactorDisabledNotification | účet |
recovery_code_used | RecoveryCodeUsedNotification | účet |
passkey_added / passkey_removed | PasskeyAddedNotification / PasskeyRemovedNotification | účet |
account_locked | AccountLockedNotification | účet |
refresh_token_reuse | SuspiciousSessionNotification | účet (opakované použitie refresh tokenu; rodina relácií bola zrušená) |
sign_in_blocked | SignInBlockedNotification | účet (reakcia na riziko deny) |
unusual_sign_in | UnusualSignInNotification | účet (reakcia na riziko notify) |
Upozornenia na riziko
Reakcie na riziko majú vlastné e-maily. deny pošle SignInBlockedNotification (sign_in_blocked) — nikto sa neprihlásil; notify pošle po dokončení prihlásenia UnusualSignInNotification (unusual_sign_in) — jeho relácia je aktívna. Ani jeden netvrdí, že bola nejaká relácia odhlásená: SuspiciousSessionNotification (refresh_token_reuse) sa týka len opätovného použitia refresh tokenu, preto upozornenia na riziko upravíte či vypnete cez sign_in_blocked a unusual_sign_in. Oba sa odošlú vždy, keď risk.assessor guardu vráti úroveň s reakciou deny alebo notify (viď Aktivita a riziko). Publikovaná konfigurácia, ktorá je staršia a ich kľúče v notifications.classes nemá, ich posiela tiež; nastavením kľúča na null jeden vypnete:
'guards' => [
'users' => [
'model' => App\Models\User::class,
'risk' => [
'assessor' => NewDeviceRisk::class,
'reactions' => ['elevated' => 'notify', 'high' => 'deny'],
],
'notifications' => [
'classes' => [
'sign_in_blocked' => App\Notifications\SignInBlocked::class, // extends AuthenticationNotification
'unusual_sign_in' => null, // null switches it off
],
],
],
],Keď zasiahol administrátor
Štyri typy môže cez kód hostiteľa spôsobiť niekto iný než účet: password_changed (passwords()->set()), two_factor_disabled (twoFactor()->disable()), passkey_removed (passkeys()->remove()) a account_locked (lock()) — NotificationType::actorAware() vráti true práve pre ne. Ak administrátora odovzdáte ako actor:, platí:
- NotificationData::$actor obsahuje ActorData — morph typ a kľúč actora, nikdy model, pretože šifrovaný doručovací job notifikáciu serializuje a atribúty administrátora (hash hesla, 2FA tajomstvo) nepatria do úložiska fronty ani do failed_jobs. ActorData::fromModel() ho vytvorí (neuložený model vyhodí InvalidArgumentException), is($model) porovná a resolve() model znova načíta — null, ak už neexistuje.
- toMail() vezme predmet, úvod a záver z notifications.<type>.by_actor.*; riadky s tlačidlom, kódom a platnosťou zostanú. Text hovorí o „administrátorovi“ a actora nikdy nemenuje.
- Udalosť (PasswordChanged, TwoFactorDisabled, PasskeyRemoved, AccountLocked) nesie model actora ako actor.
Samotný účet sa za actora nepovažuje, takže vlastné toky používateľa, HTTP endpointy aj automatické uzamknutie posielajú vždy základný text; bez actor: sa nič nemení a ostatné typy actora ignorujú. Nové riadky balík dodáva v angličtine a slovenčine:
| Kľúč notifications.… | sk |
|---|---|
password_changed.by_actor.subject | Vaše heslo do aplikácie :app zmenil administrátor |
password_changed.by_actor.intro | Administrátor zmenil heslo k vášmu účtu. |
password_changed.by_actor.outro | Ak ste to nečakali, okamžite kontaktujte podporu. |
two_factor_disabled.by_actor.subject | Dvojfaktorové overenie vypol administrátor |
two_factor_disabled.by_actor.intro | Administrátor vypol vo vašom účte dvojfaktorové overenie. |
two_factor_disabled.by_actor.outro | Ak ste to nečakali, okamžite kontaktujte podporu a dvojfaktorové overenie znova zapnite. |
passkey_removed.by_actor.subject | Administrátor odstránil z vášho účtu prístupový kľúč |
passkey_removed.by_actor.intro | Administrátor odstránil z vášho účtu prístupový kľúč. Na prihlásenie ho už nemožno použiť. |
passkey_removed.by_actor.outro | Ak ste to nečakali, okamžite kontaktujte podporu. |
account_locked.by_actor.subject | Váš účet v aplikácii :app zablokoval administrátor |
account_locked.by_actor.intro | Administrátor dočasne zablokoval váš účet. Kým blokovanie neskončí, nemôžete sa prihlásiť. |
account_locked.by_actor.outro | Ak ste to nečakali, kontaktujte podporu. |
Hostiteľ, ktorý preklady publikoval ešte pred pridaním týchto kľúčov, ich dostane tiež — Laravel publikovaný súbor zlúči s riadkami balíka; jazyk, ktorý balík nedodáva, sa pre ne vráti k app.fallback_locale, kým ich nedoplníte. Ak ich chcete sformulovať inak, prepíšte authentication::notifications.<type>.by_actor.* v publikovaných prekladoch. Ak má e-mail actora pomenovať, nahraďte triedu (notifications.classes.password_changed) a actora načítajte:
use Illuminate\Notifications\Messages\MailMessage;
use RoundlyConsulting\Auth\Notifications\PasswordChangedNotification;
final class NamedPasswordChangedNotification extends PasswordChangedNotification
{
public function toMail(object $notifiable): MailMessage
{
$mail = parent::toMail($notifiable);
$admin = $this->data->actor?->resolve(); // null without an actor, or when it was deleted
return $admin === null ? $mail : $mail->line(__('Changed by :name.', ['name' => $admin->name]));
}
}Doručovanie
- after_response (predvolené) — odpoveď pre známy účet nie je merateľne pomalšia než pre neznámy.
- queue — cez šifrovaný job (ShouldBeEncrypted) na notifications.connection / queue, takže odkaz ani kód nikdy neležia čitateľné vo fronte.
- sync — priamo, na vývoj.
Odkazy
Odkazy v e-mailoch sa skladajú len z konfigurácie (žiadne presmerovanie od klienta) so zástupnými symbolmi {frontend}, {app}, {guard}, {email} a {token}. Predvolene je tajomstvo vo fragmente URL (#token=…), takže sa nikdy nedostane do logu servera ani do hlavičky Referer — frontend prečíta location.hash a token pošle POST požiadavkou. Mail driver log mimo vývoja nepoužívajte.
'guards' => [
'users' => [
'model' => App\Models\User::class,
'notifications' => [
'delivery' => 'queue', // sync|after_response|queue
'queue' => 'mail',
'classes' => [
'magic_link' => App\Notifications\MagicLink::class, // extends AuthenticationNotification
'new_device' => null, // null disables it
],
'frontend_url' => 'https://app.example.com',
'urls' => [
'magic_link' => '{frontend}/auth/magic-link?guard={guard}#token={token}',
],
],
],
],Texty a jazyk
Texty sú v authentication::notifications.* a balík ich dodáva v angličtine a slovenčine (en, sk); ostatné jazyky sa vrátia k app.fallback_locale, kým ich nedoplníte do lang/vendor/authentication/<locale>/. Na úpravu či doplnenie textov publikujte preklady. Účty dostávajú e-maily vo svojom jazyku cez preferredLocale():
php artisan vendor:publish --tag=authentication-translationsRiadok o platnosti sa vykresľuje cez trans_choice() podľa zostávajúcich minút, takže má tvary množného čísla (publikovaná úprava bez | funguje naďalej), a :reason pri opätovnom použití refresh tokenu sa vykreslí z notifications.refresh_token_reuse.reasons.* v jazyku e-mailu.
Prejavte lásku k open source
Tento balík je zadarmo pod licenciou MIT. Ak vám šetrí čas, jednorazový príspevok alebo členstvo na Patreone nám pomôže ho ďalej udržiavať, testovať a dokumentovať.
Ďalšie spôsoby podpory vrátane kryptomienOdoslaním daru súhlasíte s našimi podmienkami prijímania darov.
Chcete to zabudovať do svojho produktu?
Naše balíky integrujeme do zákazkových Laravel a AI riešení. Napíšte nám, na čom pracujete, a ozveme sa do 48 hodín.