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

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ľkaStĺpceKľúče
permissionsid, name (unikátne), description (jsonb, nullable), timestampsAutoinkrementálne id.
rolesid, name, description (jsonb, nullable), owner_type, owner_id, owner_key, timestampsAutoinkrementá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_rolepermission_id, role_idOba cudzie kľúče sa pri zmazaní kaskádujú; primárny kľúč (permission_id, role_id).
model_rolesrole_id, model_type, model_idrole_id sa pri zmazaní kaskáduje; index (model_id, model_type); primárny kľúč (role_id, model_id, model_type).
model_permissionspermission_id, model_type, model_idpermission_id sa pri zmazaní kaskáduje; index (model_id, model_type); primárny kľúč (permission_id, model_id, model_type).
role_assignmentsid, role_id, model_type, model_id, scope_type, scope_id, valid_from, valid_until, fingerprint, timestampsrole_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_assignmentsid, permission_id, model_type, model_id, scope_type, scope_id, valid_from, valid_until, fingerprint, timestampsTo 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_typeStĺpec model_idPoužite, keď vaši držitelia…
bigintunsignedBigIntegerpoužívajú predvolené autoinkrementálne kľúče Laravelu (predvolené)
uuiduuidpoužívajú HasUuids
ulidulidpoužívajú HasUlids

Nastavte ho pred publikovaním a spustením migrácií — schéma sa vydaním zmrazí:

PERMISSIONS_KEY_TYPE=uuid
use 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 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.