NovinkaZverejnili sme 50+ Laravel balíkov ako open source
Custom AI apps, agents and automation — Roundly ConsultingRoundly
Všetky balíky
Sentinel for Laravel

Middleware, pravidlo a scopes

AliasTriedaParametreSprávanie
sentinel.verifiedHttp\Middleware\VerifySealsžiadne = každý model routy; alebo param[@seal],…Overí modely routy po route-model bindingu; zlyhanie odpovie middleware.verified_status (409) so všeobecnou správou — nikdy nie so stavom či dôvodom.
sentinel.idempotentHttp\Middleware\EnsureIdempotencyoptional (predvolené) alebo required, voliteľne TTL v sekundáchIdempotenčné kľúče.
sentinel.signedHttp\Middleware\VerifyHttpSignaturevoliteľný názov profiluPodpisy HTTP správ.
sentinel.single-useHttp\Middleware\ConsumeSingleUseUrl—Jednorazové URL.

Odporúčané poradie: sentinel.signed → auth → sentinel.idempotent → (route-model binding) → sentinel.verified.

sentinel.verified

Route::get('/invoices/{invoice}', ShowInvoice::class)->middleware('sentinel.verified');
Route::put('/invoices/{invoice}/lines/{line}', UpdateLine::class)->middleware('sentinel.verified:invoice@financial');
  • Beží po route-model bindingu — ak ho deklarujete ako middleware routy v skupinách web alebo api, platí to automaticky. Pomenovaný parameter bez @seal overí všetky pečate daného modelu.
  • Zlyhanie pri middleware.verified_reaction = abort (predvolené) vyhodí SealVerificationFailedHttpException: status middleware.verified_status (409) a všeobecnú preloženú správu — stav ani dôvod sa klientovi nikdy neprezradia. Jej getPrevious() je TamperedModelException pre report() vo vašom exception handleri.
  • S report sa zistenie nahlási (TamperDetected, log) a požiadavka pokračuje.
  • Pomenovaný parameter, ktorý nie je naviazaný alebo nie je zapečatiteľný, vyhodí SealingMisconfiguredException (500, bezpečné zlyhanie).

Typované parametre

Každý middleware má statického pomocníka, ktorý sa overí už pri deklarácii routy — preklep zlyhá pri načítaní rout, nie až pri požiadavke:

PomocníkOverí
VerifySeals::using(string ...$parameters)Každý ^[A-Za-z0-9_]{1,64}(@[a-z0-9_.-]{1,64})?$; žiadny = každý sealable parameter.
EnsureIdempotency::optional(?int $ttl = null) / required(?int $ttl = null)TTL 60–2 592 000 sekúnd (vlastný rozsah middleware).
VerifyHttpSignature::profile(?string $profile = null)Profil existuje v sentinel.signatures.profiles; null = predvolený profil.
use RoundlyConsulting\Sentinel\Http\Middleware\EnsureIdempotency;
use RoundlyConsulting\Sentinel\Http\Middleware\VerifyHttpSignature;
use RoundlyConsulting\Sentinel\Http\Middleware\VerifySeals;

Route::put('/invoices/{invoice}', UpdateInvoice::class)->middleware(VerifySeals::using('invoice@financial'));
Route::post('/orders', StoreOrder::class)->middleware(EnsureIdempotency::required(ttl: 3600));
Route::post('/partner/events', PartnerEvents::class)->middleware(VerifyHttpSignature::profile('partners'));

IntactSeal a verifySeals()

use RoundlyConsulting\Sentinel\Rules\IntactSeal;

$request->validate([
    'invoice_id' => ['required', new IntactSeal(Invoice::class, seal: 'financial')],                        // the key
    'invoice_number' => ['required', new IntactSeal(Invoice::class, seal: 'financial', column: 'number')],  // a unique column
]);

$report = Invoice::query()->withSeals()->get()->verifySeals();   // reuses the eager-loaded seals
Invoice::query()->whereSealed()->count();
Invoice::query()->whereNotSealed('identity')->get();

new IntactSeal(string $model, ?string $seal = null, ?string $column = null): vstupom je kľúč modelu alebo hodnota stĺpca column — neplatný názov stĺpca vyhodí SealingMisconfiguredException::invalidColumn už pri vytvorení pravidla, nie pri jeho behu. Model sa načíta s pozastaveným overením pri načítaní a potom sa overí (jedna pečať, alebo všetky, ak žiadnu neuvediete): chýbajúci model zlyhá ako exists, model, ktorý nie je neporušený, so sentinel::validation.intact_seal — stav ani dôvod sa neprezradia.

Makrá

MakroČo robí
Http::withIdempotencyKey(?string $key = null)Pošle hlavičku idempotency.header (Idempotency-Key) so zadaným kľúčom alebo novým UUIDv7, serializovaným ako reťazec RFC 9651.
Http::withSignature(string $keyId, ?SigningOptions $options = null)Podpíše finálnu požiadavku (RFC 9421) kľúčom odchádzajúceho kruhu cez SentinelManager::signRequest().
$collection->verifySeals(?string $seal = null)VerificationReport nad Eloquent kolekciou; použije eager-loadované riadky pečatí.

Makrá HTTP klienta sa registrujú na PendingRequest pri štarte a verifySeals() na Eloquent kolekciách — každé len vtedy, ak makro s rovnakým názvom ešte neexistuje.

Query scopes

Invoice::query()->whereSealed()->get();               // has a seal row for the default seal
Invoice::query()->whereSealed('identity')->get();
Invoice::query()->whereNotSealed()->count();          // no seal row (unsealed or deleted)
Invoice::query()->withSeals()->get();                 // eager-load sentinelSeals

$invoice->sentinelSeals je vzťah MorphMany k uloženým riadkom Models\Seal.

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 kryptomien

Odoslaní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.