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