Inštalácia
Pridajte balík a spustite sprievodcu inštaláciou. Service provider sa zaregistruje automaticky; balík neregistruje žiadny globálny alias fasády, preto vždy importujte RoundlyConsulting\Sentinel\Facades\Sentinel:
composer require roundly-consulting/sentinel-for-laravel
php artisan sentinel:installsentinel:install publikuje konfiguráciu aj migrácie, ukáže typy morph kľúčov, ktoré treba určiť pred migráciou, vygeneruje kľúč predvoleného kruhu, ak žiadny nemá (vypíše ho ako riadky env — do .env nikdy nezapisuje), a vypíše ďalšie kroky. Okrem publikovania nemení žiadne súbory aplikácie; opakované spustenie neuškodí a --force prepíše publikované súbory.
Tie isté kroky ručne
Publikujte a spustite migrácie — šesť tabuliek, všetky s prefixom sentinel_. Migrácie sa len publikujú, idú len dopredu a balík ich nikdy nenačítava sám:
php artisan vendor:publish --tag="sentinel-migrations"
php artisan migrateVoliteľne publikujte konfiguračný súbor a preklady (angličtina a slovenčina):
php artisan vendor:publish --tag="sentinel-config"
php artisan vendor:publish --tag="sentinel-translations"| Tag | Publikuje |
|---|---|
sentinel-migrations | Šesť migrácií len na publikovanie, len dopredu (bez down()), s doplnenou časovou značkou. |
sentinel-config | config/sentinel.php |
sentinel-translations | lang/vendor/sentinel/{en,sk} |
Zvoľte typy kľúčov, potom migrujte
Morph stĺpce sa riadia nastaveniami sentinel.key_type (zapečatené modely) a sentinel.actor_key_type (aktéri, vlastníci kľúčov, subjekty nonce) — predvolene bigint, prípadne uuid / ulid. Nastavte ich pred migráciou. Ak kombinujete celočíselné a UUID kľúče na MySQL alebo SQLite, zvoľte uuid: stĺpec je tam char(36) a celočíselné kľúče udrží ako reťazce. Na PostgreSQL je stĺpec uuid natívny a celé čísla odmietne, preto pri zmiešaných kľúčoch najprv publikujte migrácie a tieto id stĺpce zmeňte na string(36). Obe nastavenia sa čítajú striktne: čokoľvek iné než bigint, uuid alebo ulid (bez ohľadu na veľkosť písmen) zastaví migráciu výnimkou — preklep nikdy potichu nevytvorí stĺpce bigint.
Tabuľky sentinel_keys, sentinel_idempotency_keys a sentinel_nonces používajú sentinel.database.connection; sentinel_checkpoints, sentinel_ledger a sentinel_seals žijú na pripojení každého zapečateného modelu a zdieľajú jeho transakciu. Ak máte zapečatené modely na viacerých pripojeniach, spustite migrácie 0002–0004 na každom a pripojenia uveďte v sentinel.ledger.connections.
Vytvorte prvý kľúč
Predvolený kruh používa driver config: príkaz vypíše tri riadky env a do .env sám nikdy nezapisuje. Pridajte ich do úložiska tajomstiev a zaobchádzajte s nimi ako s tajomstvom:
php artisan sentinel:key:generate
# SENTINEL_KEY_ID=default-20261002-k3f9qa
# SENTINEL_ALGORITHM=hmac-sha256
# SENTINEL_KEY="base64:…"Pre asymetrické pečate použite --algorithm=ed25519 (alebo ecdsa-p256-sha256, …); verejná polovica sa vypíše ako SENTINEL_PUBLIC_KEY pre uzly len na overovanie. Kľúče HTTP partnerov žijú v kruhu http (driver database) — vygenerujte si vlastný alebo importujte partnerov:
php artisan sentinel:key:generate --ring=http --database
php artisan sentinel:key:import acme-2026-10 --ring=http --algorithm=ed25519 --file=acme.pem --owner-type=partner --owner-id=7Zapečaťte model a existujúce riadky
use Illuminate\Database\Eloquent\Model;
use RoundlyConsulting\Sentinel\Concerns\HasSeals;
use RoundlyConsulting\Sentinel\Contracts\Sealable;
use RoundlyConsulting\Sentinel\Definition\SealBuilder;
final class Invoice extends Model implements Sealable
{
use HasSeals;
public static function defineSeals(SealBuilder $seals): void
{
$seals->seal('financial')->attributes('customer_id', 'currency', 'amount', 'status');
}
}Každý Eloquent zápis teraz riadok zapečatí. Pečate sú predvolene striktné — riadok bez pečate je zistenie — preto existujúcim riadkom raz vytvorte baseline s dôvodom, ktorý sa zapíše do denníka. Riadky, ktoré už majú históriu v denníku, no pečať stratili, sa nahlásia a baseline nikdy nedostanú: zmazaná pečať je dôkaz.
php artisan sentinel:seal-missing "App\Models\Invoice" --reason="Initial baseline"Rýchly štart
Overujte všade, kde na tom záleží — v kóde, v middleware routy alebo v plánovanom skene:
use RoundlyConsulting\Sentinel\Facades\Sentinel;
$invoice->isIntact(); // true when every seal verifies
Sentinel::for($invoice)->verifyOrFail(); // throws TamperedModelException otherwise
Route::get('/invoices/{invoice}', ShowInvoice::class)->middleware('sentinel.verified');Keď niekto zmení zapečatenú hodnotu mimo aplikácie, overenie pomenuje zmenený stĺpec a ďalšie zápisy do modelu sa odmietnu, kým niekto zmenu nepotvrdí s dôvodom:
// Someone runs UPDATE invoices SET amount = 0 WHERE id = 42 in a SQL console:
Sentinel::for($invoice)->verify();
// VerificationResult { status: Tampered, reason: 'mac', changedAttributes: ['a:amount'], … }
$invoice->update(['note' => 'x']); // TamperedModelException: refused until acknowledged
Sentinel::for($invoice)->by($admin)->because('INC-88: refund fixed by the DBA')->acknowledge();Skontrolujte inštaláciu
Nič netreba plánovať: Sentinel si údržbu zaregistruje v plánovači Laravelu sám (php artisan schedule:run spúšťajte každú minútu ako pri každej plánovanej úlohe). Potom spustite kontrolu stavu — desať kontrol, každá ok, warning alebo failure:
php artisan sentinel:check # exit 1 on a failure
php artisan sentinel:check --strict # warnings fail too (CI)Odporúčané produkčné nastavenia
- Predvolený kruh nechajte na drivere config — kľúče tak zostanú mimo databázy.
- Ak kľúče zdieľa viac aplikácií, nastavte SENTINEL_CONTEXT na hodnotu jedinečnú pre aplikáciu.
- Nakonfigurujte kotvu mimo databázy aplikácie: SENTINEL_ANCHORS=cache so SENTINEL_ANCHOR_CACHE_STORE na samostatný Redis, alebo filesystem na objektovom úložisku s object lock.
- Servery len na overovanie: SENTINEL_AUTO_SEAL=false a iba verejný materiál kľúčov.
Pomenovanie
laravel/sentinel (inštaluje sa s Horizonom, Pulse a Telescope) obsahuje Laravel\Sentinel\Sentinel a Laravel\Sentinel\SentinelManager a cartalyst/sentinel registruje globálny alias Sentinel. Preto tento balík žiadny alias neregistruje: RoundlyConsulting\Sentinel\Facades\Sentinel a RoundlyConsulting\Sentinel\SentinelManager importujte explicitne — IDE môže automaticky naimportovať nesprávnu triedu. php artisan about ukáže plný názov triedy manažéra.
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.