Middleware, pravidlo a scopes
| Alias | Trieda | Parametre | Správanie |
|---|---|---|---|
sentinel.verified | Http\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.idempotent | Http\Middleware\EnsureIdempotency | optional (predvolené) alebo required, voliteľne TTL v sekundách | Idempotenčné kľúče. |
sentinel.signed | Http\Middleware\VerifyHttpSignature | voliteľný názov profilu | Podpisy HTTP správ. |
sentinel.single-use | Http\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ík | Overí |
|---|---|
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 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.