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

Každé prepojenie nesie vlastnú sadu reťazcov oprávnení — ľubovoľné názvy, ktoré vaša aplikácia používa, napríklad view, edit alebo publish. Tie isté dva modely tak môžu mať v rôznych kontextoch rôzne práva. Duplicity sa odstraňujú automaticky.

Zmena oprávnení

use RoundlyConsulting\Connections\Facades\Connections;

$permissions = Connections::between($user, $team)->permissions();

$permissions->grant('publish');          // Connection — creates the connection if absent
$permissions->revoke('publish');         // Connection — throws ConnectionNotFound if absent
$permissions->sync('view', 'edit');      // Connection — exact set, creates if absent
$permissions->clear();                   // Connection — remove every permission; throws ConnectionNotFound if absent

$permissions->all();                     // Collection<int, string> — what is stored
$permissions->has('edit');               // bool
$permissions->hasAny('view', 'edit');    // bool
$permissions->hasAll('view', 'edit');    // bool
  • grant() pridá oprávnenia do sady a chýbajúce prepojenie vytvorí.
  • revoke() oprávnenia odoberie; ak prepojenie neexistuje, vyhodí ConnectionNotFound.
  • sync() nahradí sadu presne zadanými oprávneniami a chýbajúce prepojenie vytvorí.
  • clear() sadu vyprázdni a na rozdiel od sync() prepojenie nikdy nevytvorí — ak neexistuje, vyhodí ConnectionNotFound.
  • Oprávnenia zadávajte explicitne — grant() a sync() nepoužijú oprávnenia pripravené cez withPermissions().
  • ConnectionPermissionsChanged sa spustí, len keď sa sada naozaj zmení, a nesie predošlý aj aktuálny zoznam.

Trait ponúka tie isté úpravy ako metódy modelu — skratky, ktoré idú cez ten istý manažér:

$user->grantThroughConnection($team, 'publish', 'archive');
$user->revokeThroughConnection($team, 'archive');
$user->syncConnectionPermissions($team, ['view', 'edit']);
$user->clearConnectionPermissions($team);

$user->permissionsThroughConnection($team);   // Collection<int, string> of the stored set

Overovanie oprávnení

use RoundlyConsulting\Connections\Facades\Connections;

Connections::between($user, $team)->permissions()->has('edit');              // bool
Connections::between($user, $team)->permissions()->hasAny('view', 'edit');   // bool
Connections::between($user, $team)->permissions()->hasAll('view', 'edit');   // bool

// Trait shorthand — the same checks from the connector's side.
$user->hasPermissionThroughConnection($team, 'edit');             // bool
$user->hasPermissionThroughConnection($team, 'edit', force: true);// bypass the cache
$user->hasAnyPermissionThroughConnection($team, 'view', 'edit');  // bool
$user->hasAllPermissionsThroughConnection($team, 'view', 'edit'); // bool

// On a Connection row you already hold.
$connection->hasPermission('edit');             // bool
$connection->hasAnyPermission('view', 'edit');  // bool
$connection->hasAllPermissions('view', 'edit'); // bool

Kontroly idú od connectora ku connectable a permissions()->has() je tá istá kontrola ako hasPermissionThroughConnection() v traite. Kým je zapnuté enforce_active_on_check (predvolene áno), prepojenie v stave pending, blocked alebo po expirácii neudelí nič. Kontroly sa v rámci requestu pamätajú pre každú dvojicu — cache obídete, keď metóde traitu odovzdáte force: true (pozrite Kešovanie).

permissions()->all() aj permissionsThroughConnection() z traitu vrátia uloženú sadu bez ohľadu na stav či expiráciu — na rozhodovanie o prístupe používajte metódy kontroly.

Zástupné znaky

Prepojenie, ktorého sada obsahuje *, prejde akoukoľvek kontrolou oprávnenia, a segmentový zástupný znak ako posts.* zodpovedá posts.edit. Sady bez zástupného znaku sa správajú presne ako doteraz — ide čisto o voľbu podľa uložených dát:

Connections::between($user, $team)->withPermissions('posts.*')->connect();
$user->hasPermissionThroughConnection($team, 'posts.edit');  // true
$user->hasPermissionThroughConnection($team, 'users.edit');  // false

Connections::between($admin, $team)->withPermissions('*')->connect();
$admin->hasPermissionThroughConnection($team, 'anything');   // true

Zástupné znaky rešpektujú aj scope withPermission() a connectionsWithPermission(): zodpovedá im presné oprávnenie, * aj koncové segmentové zástupné znaky ako posts.* či posts.comments.*. Iný tvar vzoru — napríklad posts.*.edit — rešpektujú len hasPermission() a hasPermissionThroughConnection().

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.