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:
$rbac
es el contenedor de nuestros roles y permisos.$permission
es el nombre del permiso que se debe revisar.$params
es un arreglo de parámetros, esta se puede usar para
pasar el usuario que es dueño de la publicación.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).