Aktivita a riziko
Obmedzovanie pokusov
Desať limitov, overených ešte pred prácou s prihlasovacími údajmi. Identifikátory sa ukladajú ako HMAC, takže žiadny e-mail sa nedostane do kľúča cache. Prekročenie vráti too_many_attempts (429, Retry-After), zaznamená pokus a spustí LoginThrottled:
'throttle' => [ // max attempts / decay seconds
'login' => ['max' => 5, 'decay' => 60], // identifier + IP
'login_ip' => ['max' => 50, 'decay' => 600], // IP, any identifier
'login_account' => ['max' => 20, 'decay' => 3_600], // identifier, any IP
'email_request' => ['max' => 3, 'decay' => 600], // link/OTP/reset/resend per identifier+IP
'email_request_ip' => ['max' => 20, 'decay' => 600],
'email_request_account' => ['max' => 10, 'decay' => 3_600],
'refresh' => ['max' => 30, 'decay' => 60], // per IP
'registration' => ['max' => 5, 'decay' => 3_600], // per IP
'verification' => ['max' => 5, 'decay' => 600], // verify attempts per identifier+IP
'reauthentication' => ['max' => 5, 'decay' => 300], // per session
],
'lockout' => [
'enabled' => false,
'threshold' => 10,
'duration' => 900,
'reset_unlocks' => true,
],Uzamknutie (voliteľné)
Predvolene vypnuté: obmedzovanie pokusov odoláva DoS útokom, kým tvrdý zámok umožní útočníkovi zamknúť obeť. Po zapnutí sa pri dosiahnutí threshold nastaví locked_until na duration sekúnd, spustí sa AccountLocked a vlastník dostane e-mail. Uzamknutý identifikátor dostane too_many_attempts (nikdy account_locked — to by potvrdilo heslo), zámok nikdy neruší existujúce relácie a reset_unlocks ho zruší pri obnove hesla.
Prihlasovacia aktivita
Jeden záznam na pokus: guard, typ, výsledok, metóda, dôvod, účet, identifikátor (v otvorenej podobe, ako hash alebo vôbec), IP, user agent, odtlačok zariadenia, id relácie a príznak nového zariadenia. Obnova tokenu sa zaznamená len pri neúspechu. GET activity vráti vlastné záznamy účtu bez identifikátora a odtlačku:
use RoundlyConsulting\Auth\Enums\ActivityOutcome;
use RoundlyConsulting\Auth\Events\LoginActivityRecorded;
use RoundlyConsulting\Auth\Facades\Authentication;
use RoundlyConsulting\Auth\Support\Models;
Authentication::guard('users')->activity($user, 20); // paginated, newest first
LoginActivity::query()->where('outcome', ActivityOutcome::Throttled->value)->count();
// Enrich rows with a location from your own lookup
Event::listen(function (LoginActivityRecorded $event): void {
$activity = Models::loginActivities()->find($event->activityId);
[$country, $city] = GeoIp::lookup($activity->ip_address); // your own lookup
$activity->enrich($country, $city);
});Nové zariadenia
Odtlačok je HMAC guardu a hlavičky X-Device-Id, alebo user agenta, ak hlavička chýba. Zariadenie je známe len po dokončenom prihlásení s týmto odtlačkom v rámci doby uchovávania — nepočíta sa odkaz na obnovu či prihlásenie vyžiadaný z daného zariadenia ani opätovné overenie (možno ukradnutým) prístupovým tokenom. Úplne prvé prihlásenie sa za nové nepovažuje (skip_first_login). Nové zariadenie spustí NewDeviceDetected a po dokončení prihlásenia pošle vlastníkovi e-mail.
Riziko
Pripojte vlastný assessor. Po prvom faktore dostane guard, účet, metódu, kontext relácie a príznak nového zariadenia a vráti úroveň (low, elevated, high) so signálmi:
use RoundlyConsulting\Auth\Contracts\AssessesLoginRisk;
use RoundlyConsulting\Auth\DataTransferObjects\LoginRiskContext;
use RoundlyConsulting\Auth\DataTransferObjects\RiskAssessment;
use RoundlyConsulting\Auth\Enums\RiskLevel;
final class NewDeviceRisk implements AssessesLoginRisk
{
public function assess(LoginRiskContext $context): RiskAssessment
{
return $context->newDevice
? new RiskAssessment(RiskLevel::Elevated, ['new_device'])
: new RiskAssessment();
}
}'activity' => [
'enabled' => true,
'store_identifier' => 'plain', // plain|hash|none
'retention_days' => 90,
'new_device' => [
'enabled' => true,
'header' => 'X-Device-Id',
'skip_first_login' => true,
],
],
'risk' => [
'assessor' => NewDeviceRisk::class, // class-string<AssessesLoginRisk>|null
'reactions' => ['elevated' => 'notify', 'high' => 'require_second_factor'], // allow|notify|require_second_factor|deny
'deny_response' => 'uniform', // uniform|explicit
],Reakcie podľa úrovne: allow; notify (udalosť a e-mail po dokončení); require_second_factor (overovací krok sa pridá pri každom spôsobe prihlásenia — aj pri e-mailových s vypnutým after_email_login — a ak účet nemá faktor na dodatočné overenie, prihlásenie sa zamietne); deny (SuspiciousLoginDetected, e-mail vlastníkovi, jednotné invalid_credentials — alebo login_denied pri deny_response = explicit).
Čistenie
authentication:prune natrvalo zmaže výzvy a jednorazové tokeny deň po expirácii a ukončené pozvánky aj aktivitu po uplynutí doby uchovávania guardu. Všetky štyri modely sú zároveň Prunable, takže funguje aj model:prune:
// routes/console.php
Schedule::command('authentication:prune')->daily();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.