A free and open-source book on ZF3 for beginners

Translation into this language is not yet finished. You can help this project by translating the chapters and contributing your changes.

17.4. Introducción a las aserciones dinámicas

Debemos notar que para el ejemplo Blog tenemos dos permisos «especiales» llamados post.own.edit y post.own.publish. Estos permisos son especiales porque permiten al autor editar solo las publicaciones que él ha creado.

Para «revisar» estos permisos especiales para un usuario real necesitamos determinar si la publicación realmente pertenece al usuario.

Además, en el sitio web Role Demo tendremos un permiso especial llamado profile.own.view. Este permiso es especial porque permite al usuario ver el perfil del usuario del que es dueño.

Para implementar aserciones dinámicas en el ejemplo Role Demo, usaremos un servicio especial llamado gestor de aserciones, en ingles assertion manager. El gestor de aserciones se implementará en la clase RbacAssertionManager que vive en el espacio de nombres Application\Service y se ve de la siguiente manera:

<?php
namespace Application\Service;

use Zend\Permissions\Rbac\Rbac;
use User\Entity\User;

/**
 * This service is used for invoking user-defined RBAC dynamic assertions.
 */
class RbacAssertionManager
{
    /**
     * Entity manager.
     * @var Doctrine\ORM\EntityManager
     */
    private $entityManager;

    /**
     * Auth service.
     * @var Zend\Authentication\AuthenticationService
     */
    private $authService;

    /**
     * Constructs the service.
     */
    public function __construct($entityManager, $authService)
    {
        $this->entityManager = $entityManager;
        $this->authService = $authService;
    }

    /**
     * This method is used for dynamic assertions.
     */
    public function assert(Rbac $rbac, $permission, $params)
    {
        $currentUser = $this->entityManager->getRepository(User::class)
                ->findOneByEmail($this->authService->getIdentity());

        if ($permission=='profile.own.view' && $params['user']->getId()==$currentUser->getId())
            return true;

        return false;
    }
}

Como podemos ver en el código de arriba, la clase tiene el método assert() que acepta tres argumentos:

Dentro del método assert(), podemos traer el usuario que ha iniciado sesión y compararlo con el usuario dado, de esta manera podemos regresar true si el usuario está intentando abrir su propio perfil, de lo contrario false.

En teoría, podemos tener muchos gestores de aserciones en nuestro sitio web (por ejemplo, si nuestro módulo tiene algunas aserciones dinámicas, podemos crear y registrar un gestor de aserciones para este módulo).


Top