Groupe pour les admins
On va créer un groupe pour les administrateurs qui auront droit de lecture et d'écriture sur les attributs choisis
Pour ce faire nous allons décorer le SerializerContextBuilderInterface en créant AdminGroupsContextBuilder
<?php
// src/Serializer/AdminGroupsContextBuilder.php
namespace App\Serializer;
use ApiPlatform\Core\Serializer\SerializerContextBuilderInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface;
final class AdminGroupsContextBuilder implements SerializerContextBuilderInterface
{
private $decorated;
private $authorizationChecker;
public function __construct(
SerializerContextBuilderInterface $decorated,
AuthorizationCheckerInterface $authorizationChecker
) {
$this->decorated = $decorated;
$this->authorizationChecker = $authorizationChecker;
}
public function createFromRequest(Request $request, bool $normalization, ?array $extractedAttributes = null): array
{
$context = $this->decorated->createFromRequest($request, $normalization, $extractedAttributes);
$context['groups'] = $context['groups'] ?? [];
$isAdmin = $this->authorizationChecker->isGranted('ROLE_ADMIN');
if ($isAdmin) {
$context['groups'][] = $normalization ? 'admin:read' : 'admin:write';
}
$context['groups'] = array_unique($context['groups']);
return $context;
}
}
On regarde si l'utilisateur connecté possède le ROLE_ADMIN et si oui on créé un nouveau groupe admin:read
ou admin:write
suivant si on est dans un processus de normalization ou de denormalization
On indique dans services.yaml qu'on veut décorer le context_builder d'api platoform :
App\Serializer\AdminGroupsContextBuilder:
decorates: 'api_platform.serializer.context_builder'
arguments: [ '@App\Serializer\AdminGroupsContextBuilder.inner' ]
On peut maintenant rajouter le groupe admin sur isLocked
dans notre entité User
/**
* @ORM\Column(type="boolean", nullable=false)
* @Groups({"admin:read", "admin:write"})
*/
private $isLocked;
Il nous reste également changer la sécurité sur la route put
et rajouter que le ROLE_ADMIN peut également modifier "security"="object === user or is_granted('ROLE_ADMIN')"
* itemOperations={
* "get",
* "put"={
* "validation_groups"={User::class, "validationGroups"},
* "security"="object === user or is_granted('ROLE_ADMIN')",
* "denormalization_context"={"groups"={"user:item:put"}},
* },
* "delete"
* }
On va modifier un utilisateur pour lui attribuer le ROLE_ADMIN avec la commande php bin/console doctrine:query:sql 'UPDATE user SET roles = "[\"ROLE_ADMIN\"]" WHERE email = "Jeramie_Wilkinson@yahoo.com"
Maintenant avec PUT /users/{id}
vous pouvez lire ou écrire sur isLocked
si vous êtes un admin
{
"isLocked": true
}
prev
next
Commentaires
Connectez-vous pour laisser un commentaire