Databázová schéma a typy kľúčov
Balík používa sedem tabuliek — päť z verzie 2.0 a dve tabuľky priradení, ktoré pridala verzia 2.1 spolu s vlastníkom rolí. Ich názvy pochádzajú z table_names; názvy stĺpcov sú pevné:
| Tabuľka | Stĺpce | Kľúče |
|---|---|---|
permissions | id, name (unikátne), description (jsonb, nullable), timestamps | Autoinkrementálne id. |
roles | id, name, description (jsonb, nullable), owner_type, owner_id, owner_key, timestamps | Autoinkrementálne id. Unikátne (owner_key, name) — globálna rola má owner_key '', takže globálne názvy zostávajú unikátne; indexy (owner_type, owner_id) a name. Pred migráciou 2.1: unikátne name, bez stĺpcov vlastníka. |
permission_role | permission_id, role_id | Oba cudzie kľúče sa pri zmazaní kaskádujú; primárny kľúč (permission_id, role_id). |
model_roles | role_id, model_type, model_id | role_id sa pri zmazaní kaskáduje; index (model_id, model_type); primárny kľúč (role_id, model_id, model_type). |
model_permissions | permission_id, model_type, model_id | permission_id sa pri zmazaní kaskáduje; index (model_id, model_type); primárny kľúč (permission_id, model_id, model_type). |
role_assignments | id, role_id, model_type, model_id, scope_type, scope_id, valid_from, valid_until, fingerprint, timestamps | role_id sa pri zmazaní kaskáduje; rozsah aj okno sú nullable; fingerprint (sha256 z držiteľa, roly, rozsahu a okna) je unikátny; indexy (model_id, model_type, scope_type, scope_id), (scope_type, scope_id) a valid_until. |
permission_assignments | id, permission_id, model_type, model_id, scope_type, scope_id, valid_from, valid_until, fingerprint, timestamps | To isté pre priame oprávnenia; permission_id sa pri zmazaní kaskáduje. |
Väzby na držiteľov sú polymorfné (model_type + model_id), takže roly a oprávnenia môže držať akýkoľvek Eloquent model — nielen používateľ. Vlastné aliasy z morph mapy sa v pivotoch ukladajú rovnako ako kdekoľvek inde v Laraveli.
Typ kľúča držiteľov
key_type opisuje modely, ktoré držia roly a oprávnenia — nikdy nie vlastné tabuľky balíka, tie majú vždy autoinkrementálny kľúč. Určuje typ stĺpca model_id v dvoch polymorfných pivotoch:
| key_type | Stĺpec model_id | Použite, keď vaši držitelia… |
|---|---|---|
bigint | unsignedBigInteger | používajú predvolené autoinkrementálne kľúče Laravelu (predvolené) |
uuid | uuid | používajú HasUuids |
ulid | ulid | používajú HasUlids |
Nastavte ho pred publikovaním a spustením migrácií — schéma sa vydaním zmrazí:
PERMISSIONS_KEY_TYPE=uuiduse Illuminate\Database\Eloquent\Concerns\HasUuids;
use Illuminate\Foundation\Auth\User as Authenticatable;
use RoundlyConsulting\Permissions\Concerns\HasRoles;
class User extends Authenticatable
{
use HasRoles;
use HasUuids; // pairs with PERMISSIONS_KEY_TYPE=uuid
}Nenastavený alebo prázdny kľúč znamená bigint; neznáma hodnota vyhodí InvalidConfigurationException z toolkitu, namiesto toho, aby potichu vytvorila kľúče bigint.
Typ kľúča rozsahov
assignments.scope_key_type robí to isté pre modely rozsahov a vlastníkov rolí: určuje typ scope_id v oboch tabuľkách priradení a roles.owner_id. Ak nie je nastavený, platí key_type. Jediný stĺpec scope_id nesie kľúč každého modelu rozsahu, takže všetky vaše rozsahy zdieľajú jeden typ kľúča. Stĺpce okna sú dateTime, nie timestamp — ukladajú sa v UTC na sekundy, bez posunu podľa časového pásma MySQL session a bez limitu roku 2038.
Zámerne bez soft deletes
Roly a oprávnenia nepoužívajú soft deletes: unikátny index na name by kolidoval so soft-zmazanými riadkami a každý pivot sa pri zmazaní kaskáduje — odstránením roly či oprávnenia zmiznú aj jeho priradenia.
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.