Gate, Blade a policies
Pri zapnutom gate.register (predvolene) autorizujete tak, ako je v Laraveli zvykom. Ability má tvar <prefix>.<oprávnenie> a tím je argument pre Gate:
if ($user->can('teams.manage-billing', $team)) {
// ...
}
$user->can('teams.posts.publish', $team); // a permission ability
$user->can('teams.owner', $team); // the owner ability
Gate::authorize('teams.team.update', $team); // throws a 403 when deniedAko Gate rozhoduje
- Balík registruje hook Gate::before, nie pomenované ability. Odpovedá len na ability s prefixom (predvolene teams.), ktorých prvým argumentom je Team.
- teams.owner sa vyhodnotí ako $team->isOwnedBy($user); každé iné teams.<oprávnenie> ako memberHasPermission().
- Pri nezhode vráti null, nie false, takže rozhodnú vaše vlastné gates a policies — hook nikdy neblokuje nesúvisiace ability.
- Názvy zmeníte cez gate.prefix a gate.owner_ability; s TEAMS_REGISTER_GATE=false sa nezaregistruje hook ani Blade direktívy.
Blade direktívy
@teamPermission($team, 'manage-billing')
<a href="/billing">Billing</a>
@endteamPermission
@teamRole($team, 'admin')
<button>Manage team</button>
@endteamRole
@teamOwner($team)
<button>Delete team</button>
@endteamOwner
{{-- Check a specific member instead of the signed-in user --}}
@teamPermission($team, 'posts.publish', $otherUser)
<span>Can publish</span>
@endteamPermissionKaždá direktíva predvolene overuje prihláseného používateľa; ak chcete overiť niekoho iného, odovzdajte člena ako posledný argument. Pri expirovanom členstve zlyhá @teamRole aj @teamPermission.
Tímové policies
teams:policy vygeneruje policy rozširujúcu AbstractTeamPolicy, ktorej before() povolí vlastníkovi tímu všetko nad jeho tímom a inak rozhodnú vaše metódy. Ability na úrovni triedy — $user->can('create', Team::class), viewAny — žiadny tím nenesú, takže ich before() pustí ďalej do vašej metódy:
php artisan teams:policy TeamPolicy # writes app/Policies/TeamPolicy.php
php artisan teams:policy TeamPolicy --force # overwrite an existing filenamespace App\Policies;
use Illuminate\Database\Eloquent\Model;
use RoundlyConsulting\Teams\Models\Team;
use RoundlyConsulting\Teams\Policies\AbstractTeamPolicy;
class TeamPolicy extends AbstractTeamPolicy
{
public function view(Model $user, Team $team): bool
{
return $this->allows($user, $team, 'team.view');
}
public function update(Model $user, Team $team): bool
{
return $this->allows($user, $team, 'team.update');
}
public function delete(Model $user, Team $team): bool
{
return $this->allows($user, $team, 'team.delete');
}
}Zaregistrujte ju ako obvykle (automatické objavovanie policies alebo Gate::policy()). Ručne písaným policies dá tie isté pomocné metódy owns() a allows() trait HasTeamPolicies:
use Illuminate\Database\Eloquent\Model;
use RoundlyConsulting\Teams\Concerns\HasTeamPolicies;
use RoundlyConsulting\Teams\Models\Team;
class PostPolicy
{
use HasTeamPolicies;
public function update(Model $user, Team $team): bool
{
return $this->owns($user, $team) || $this->allows($user, $team, 'posts.update');
}
}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.