Autorizácia
Autorizácia je predvolene vypnutá, takže existujúci kód sa nezmení. Zapnete ju cez comments.authorization (COMMENTS_AUTHORIZATION=true) a registráciou policy pre model Comment. Balík obsahuje povoľujúci základ — každá ability vracia true — ktorý rozšírite:
use Illuminate\Support\Facades\Gate;
use RoundlyConsulting\Comments\Models\Comment;
use RoundlyConsulting\Comments\Policies\CommentPolicy;
Gate::policy(Comment::class, CommentPolicy::class);Abilities
| Ability | Kontroluje ju | Argument |
|---|---|---|
create | Každý zápis — builder, write(), writeComment() | Subjekt — pri odpovedi pôvodný subjekt, ku ktorému sa pripája |
update | Comments::update() | Comment |
delete | Comments::delete(), deleteAll() | Comment |
restore | Comments::restore() | Comment |
moderate | Comments::approve() / hide(), approveAll() / hideAll() | Comment |
lock / unlock | Comments::lock() / unlock(), lockThread() / unlockThread(), lockReplies() / unlockReplies() | Subjekt, pri zámku vlákna Comment |
Kontroly bežia voči aktuálne prihlásenému používateľovi (pri hosťovi je $user null) a zamietnutie vyhodí UnauthorizedCommentActionException. Policy zaregistrovaná pre Comment platí aj pre podtriedu nastavenú v comments.model; ak nie je zaregistrovaná žiadna, automatické vyhľadávanie v Laraveli použije pribalenú povoľujúcu CommentPolicy.
Vlastná policy
create dostane komentovaný subjekt — pri odpovedi pôvodný subjekt, ku ktorému sa pripája — takže môžete rozhodovať podľa subjektu; lock a unlock dostanú to, čo sa zamyká. Vlastná policy, ktorej niektorá z metód chýba, danú akciu zamietne, preto rozšírte pribalenú CommentPolicy:
use Illuminate\Database\Eloquent\Model;
use RoundlyConsulting\Comments\Policies\CommentPolicy;
class ProjectCommentPolicy extends CommentPolicy
{
public function create(?Model $user, ?Model $commentable = null): bool
{
return $user !== null && $commentable instanceof Project && $commentable->hasMember($user);
}
public function lock(?Model $user, Model $lockable): bool
{
return $user?->isModerator() ?? false;
}
}namespace App\Policies;
use Illuminate\Database\Eloquent\Model;
use RoundlyConsulting\Comments\Models\Comment;
use RoundlyConsulting\Comments\Policies\CommentPolicy as BaseCommentPolicy;
class CommentPolicy extends BaseCommentPolicy
{
public function update(?Model $user, Comment $comment): bool
{
return $user !== null && $comment->actor?->is($user) === true;
}
public function delete(?Model $user, Comment $comment): bool
{
return $this->update($user, $comment);
}
}
// AppServiceProvider::boot()
Gate::policy(\RoundlyConsulting\Comments\Models\Comment::class, \App\Policies\CommentPolicy::class);Odpoveď 403
Balík nemá žiadne routy, preto výnimka nie je HTTP výnimkou. Ak chcete z vlastných controllerov odpovedať kódom 403, premapujte ju na AuthorizationException z Laravelu:
use Illuminate\Auth\Access\AuthorizationException;
use RoundlyConsulting\Comments\Exceptions\UnauthorizedCommentActionException;
// bootstrap/app.php
->withExceptions(function (Exceptions $exceptions): void {
$exceptions->map(fn (UnauthorizedCommentActionException $e) => new AuthorizationException($e->getMessage()));
})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.