A free and open-source book on ZF3 for beginners


17.4. Введение в динамические утверждения

Вы могли заметить, что для примера Blog у нас было две "особенных" привилегии – post.own.edit and post.own.publish. Они являются особенными, потому что позволяют автору редактировать только те посты, что были созданы непосредственно им.

Чтобы "проверить", соответствует ли на самом деле такая роль пользователю, нам дополнительно нужно определить, действительно ли пост принадлежит этому пользователю. Это называется динамическим утверждением.

Для вебсайта Role Demo у нас тоже будет особенная привилегия – profile.own.view. Ее особенность заключается в том, что она позволяет пользователю просматривать профиль, чьим владельцем является этот пользователь.

Для реализации динамических утверждений в примере Role Demo мы будем использовать специальный сервис, называющийся менеджер утверждений. Он будет реализован как класс RbacAssertionManager, "живущий" в пространстве имен Application\Service, и будет выглядеть следующим образом:

<?php
namespace Application\Service;

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

/**
 * Этот сервис используется для вызова определяемых пользователем динамических утверждений RBAC.
 */
class RbacAssertionManager
{
    /**
     * Менеджер сущностей.
     * @var Doctrine\ORM\EntityManager 
     */
    private $entityManager;
    
    /**
     * Служба аутентификации.
     * @var Zend\Authentication\AuthenticationService 
     */
    private $authService;
    
    /**
     * Конструирует сервис.
     */
    public function __construct($entityManager, $authService) 
    {
        $this->entityManager = $entityManager;
        $this->authService = $authService;
    }
    
    /**
     * Этот метод используется для динамичечких утверждений. 
     */
    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;
    }
}

Как можете видеть из фрагмента кода сверху, у данного класса есть метод assert(), принимающий три аргумента:

В методе assert() мы можем получить информацию о залогиненном в текущий момент пользователе и сравнить ее с информацией о совершающем переход пользователе. Таким образом, мы сможем вернуть true, если пользователь пытается открыть свой собственный профиль, и false в противном случае.

Теоретически, на вашем сайте у вас может быть много менеджеров утверждений (например, если у вашего модуля Blog есть какие-либо динамические утверждения, вы можете создать и зарегистрировать менеджер утверждений для этого модуля.


Top