---
title: "Databázová schéma — Sentinel for Laravel | Roundly"
description: "Šesť tabuliek sentinel_, ich pripojenia a cudzie kľúče, modely na čítanie, factories, uchovávanie dát a databázové oprávnenia."
url: https://roundly-consulting.com/sk/open-source/navody/sentinel-for-laravel/databazova-schema
language: sk
---

[Všetky balíky](https://roundly-consulting.com/sk/open-source.md)

[Sentinel for Laravel](https://roundly-consulting.com/sk/open-source/navody/sentinel-for-laravel.md)

# Databázová schéma

Šesť migrácií len na publikovanie a len dopredu (bez down(), časová značka sa doplní pri publikovaní, balík ich nikdy nenačítava sám). Žiadna tabuľka balíka nepoužíva soft delete a žiadny model sa nedá vymeniť — bezpečnostný stav sa ukladá len cez tieto modely a engine.

| # | Tabuľka | Pripojenie | Cudzie kľúče |
| --- | --- | --- | --- |
| 1 | `sentinel_keys` | `sentinel.database.connection` | — |
| 2 | `sentinel_checkpoints` | pripojenie sealable modelu | — |
| 3 | `sentinel_ledger` | pripojenie sealable modelu | `checkpoint_id → sentinel_checkpoints (restrict)` |
| 4 | `sentinel_seals` | pripojenie sealable modelu | `ledger_entry_id → sentinel_ledger (restrict)` |
| 5 | `sentinel_idempotency_keys` | `sentinel.database.connection` | — |
| 6 | `sentinel_nonces` | `sentinel.database.connection` | — |

Pečate, denník a kontrolné body ž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, publikujte a spustite 0002–0004 na každom a uveďte ich v ledger.connections.

## Prechod z predbežnej verzie

Migrácia 0004\_create\_sentinel\_seals\_table bola upravená priamo, aby pridala stĺpec attributes\_mac s povolenou hodnotou null (MAC dokumentu atribútov pre pečate s vypočítanými poľami); nová migrácia neexistuje. Ak ste spustili staršiu predbežnú kópiu, migrácie znovu publikujte a 0004 spustite znova, alebo stĺpec do sentinel\_seals pridajte sami — string('attributes\_mac', 192)->nullable() — ešte pred ďalším zapečateným zápisom. Inštalácie z aktuálnych migrácií stĺpec už majú.

## Modely

Čítajte ich na reporting (Seal::query()->where('key\_id', $kid)->count()), nikdy do nich nezapisujte: každý zápis vlastní engine a úpravy zachytia MAC, reťaz aj obálky. Každá časová značka balíka sa castuje cez Casts\\UtcDateTime (UTC, mikrosekundy, CarbonImmutable), takže časové pásmo aplikácie nikdy nepresiakne do uložených ani MAC-om chránených časov.

| Model | Tabuľka | Poznámky |
| --- | --- | --- |
| `Key` | `sentinel_keys` | $hidden = \['envelope'\]; obálka je šifrový text AES-256-GCM viazaný na nešifrované stĺpce riadku — od verzie 1.2 aj na label —, zapisuje a otvára ju úložisko kľúčov. |
| `Seal` | `sentinel_seals` | sealable(): MorphTo, sealedBy(): MorphTo, ledgerEntry(): BelongsTo; manifest / field\_tags → array; event → SealEvent. |
| `LedgerEntry` | `sentinel_ledger` | Bez timestamps; len pripájanie (Eloquent update a delete vyhodia výnimku, aj tiché); sealable(), actor(), checkpoint(). |
| `Checkpoint` | `sentinel_checkpoints` | UPDATED\_AT = null; len pripájanie. |
| `IdempotencyKey` | `sentinel_idempotency_keys` | $hidden = \['response', 'owner\_token'\]; status je processing alebo completed. |
| `Nonce` | `sentinel_nonces` | UPDATED\_AT = null; subject(): MorphTo; kind → NonceKind. |

## Factories

- KeyFactory — ->hmac(), ->ed25519(), ->ecdsaP256(), ->verifyOnly(), ->revoked(), ->retired(), ->pending(), ->ring(), všetky s platnými obálkami.
- SealFactory — ->forSealable(Model $m, string $seal), štrukturálne platná, no nepodpísaná: pre testy Malformed a negatívne testy.
- LedgerEntryFactory — ->forSealable(Model $m, string $seal), ->tombstone(SealEvent $event = SealEvent::Deleted); plus CheckpointFactory.
- IdempotencyKeyFactory — ->processing(), ->completed(), ->expired().
- NonceFactory — ->issued(), ->seen(), ->consumed(), ->expired().

## Uchovávanie

| Tabuľka | Rastie s | Čistenie |
| --- | --- | --- |
| `sentinel_seals` | jeden riadok na (model, pečať) | zmaže sa s tvrdo zmazanými modelmi |
| `sentinel_ledger` | jeden riadok na udalosť pečatenia | nikdy (dôkaz) |
| `sentinel_checkpoints` | jeden riadok na dávku kontrolného bodu | nikdy |
| `sentinel_keys` | kľúče | nikdy (namiesto toho vyraďte alebo odvolajte) |
| `sentinel_idempotency_keys` | idempotentné požiadavky | sentinel:prune (expirované) |
| `sentinel_nonces` | vydané a zapamätané nonce | sentinel:prune (expirované) |

## Ochrana tabuliek

Sentinel odhalí zmeny aj v týchto tabuľkách, no databázové oprávnenia manipuláciu sťažia už na začiatku. Používateľ aplikácie potrebuje INSERT a SELECT na sentinel\_ledger a sentinel\_checkpoints, na denníku len UPDATE (checkpoint\_id) a jedno oprávnenie na zámok riadku, ktoré si vyžaduje každý engine, pretože sentinel:checkpoint zamyká koniec kontrolných bodov cez SELECT … FOR UPDATE. Nikdy nie DELETE. Prístupové údaje k úložisku kotvy držte oddelene od databázových.

```sql
-- PostgreSQL
GRANT SELECT, INSERT ON sentinel_ledger, sentinel_checkpoints TO app;
GRANT UPDATE (checkpoint_id) ON sentinel_ledger TO app;
GRANT UPDATE (seq) ON sentinel_checkpoints TO app;

-- MySQL
GRANT SELECT, INSERT ON app_db.sentinel_ledger TO 'app'@'%';
GRANT SELECT, INSERT ON app_db.sentinel_checkpoints TO 'app'@'%';
GRANT UPDATE (checkpoint_id) ON app_db.sentinel_ledger TO 'app'@'%';
GRANT LOCK TABLES ON app_db.* TO 'app'@'%';
```

## 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](https://roundly-consulting.com/sk/podporte-nas.md)

Odoslaním daru súhlasíte s našimi [podmienkami prijímania darov](https://roundly-consulting.com/sk/podmienky-darov.md).

[Podporte našu open-source prácu (otvorí sa v novej karte)](https://donate.stripe.com/dRmeVe8FX5PF1Qd9pXcEw00) [Pridajte sa k nám na Patreone (otvorí sa v novej karte)](https://www.patreon.com/cw/roundly)

## 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.

[Ponuka do 48 hodín](https://roundly-consulting.com/sk/kontakt.md) [Prezrieť všetky balíky](https://roundly-consulting.com/sk/open-source/navody/sentinel-for-laravel.md)
