Как проверить разрешения других пользователей или ролей в шаблоне? в Symfony2
Я создаю этот менеджер пользователей, где администраторы могут изменять разрешения группы или пользователя. Я не хочу использовать пользовательский пакет FOS, потому что я хочу настроить много.
Я узнал, что могу дать разрешения другому пользователю в контроллере, но как я могу прочитать разрешения другого пользователя/роли? И можно ли прочитать эти разрешения другого пользователя / роли в шаблоне?
идеальный способ, которым я хотел бы это сделать,: (страница для просмотра пользователей в группе и с разрешения)
1 получить все объекты и пользователей в контроллере
2 печать пользователей и объектов в шаблоне. Рядом с объектами распечатайте разрешения этой группы: просмотр правка удалить владельца..
и то же самое для пользователя(не текущего), я хочу иметь возможность проверить разрешение пользователя(не текущего) в шаблоне. На данном объекте / классе..
Я знаю, как проверить, есть ли у пользователя роль / группа, но я хочу знать, какие разрешения у группы / пользователя есть, например, EDIT VIEW DELETE и т. д. с ACL.
Как я могу этого достичь ?
2 ответов
вы можете проверить, имеет ли текущий пользователь роль twig с помощью функции is_granted
{% if is_granted('ROLE_USER') %}
  {{ app.user.username }}
{% endif %}
получение массива ролей текущих пользователей в twig:
{{ app.user.roles }}
если вы хотите отобразить из коллекции пользователей, вы можете сделать что-то вроде этого (предполагая, что коллекция передается как пользователи)
{% for user in users %}
  <p>
     {{ user.username }}:
     {% for role in user.roles %}
      {{ role }}
     {% endfor %}
  </p>
{% endfor %}
я, наконец, нашел способ сделать это, вероятно, не самый эффективный способ сделать это, но это работает и это единственный способ я знаю это, как никто не знает, как этого добиться до сих пор.
сначала у меня есть пользователь по умолчанию для каждой группы, который не может войти (фиктивный пользователь с разрешениями по умолчанию для группы) - я получаю идентификатор безопасности для пользователя по умолчанию:
$defaultUser = $this->getDoctrine()
    ->getRepository('TdfUserBundle:User')
    ->findOneByUsername('-default-'.$group->getCode());
$sid = UserSecurityIdentity::fromAccount($defaultUser);
Я создаю массив разрешений для проверки и установки некоторых пустых массивов и загружаю проблематичный.acl_manager
$permissionsToCheck = array('VIEW', 'EDIT', 'CREATE', 'DELETE', 'OPERATOR', 'MASTER', 'OWNER');
$aclManager = $this->get('problematic.acl_manager');
затем я перебираю объекты, для которых я хочу проверить разрешение, и проверяю разрешения, которые я установил раньше в $permissionsToCheck var. Я проверяю разрешения для пользователя по умолчанию. Результат помещается в массив, который я отправляю в шаблон.
foreach($forumCategories as $forumCategory) :
    $permissionArray[] = $this->checkPermissions($sid, $forumCategory, $permissionsToCheck, '');
endforeach;
функция checkPermissions возвращает массив разрешений и некоторые вещи, которые мне нужны от данного объекта.
private function checkPermissions($sid, $object, $permissionsToCheck, $type) 
{
    $aclProvider = $this->get('security.acl.provider');
    $oid = ObjectIdentity::fromDomainObject($object);
    try {
        $acl = $aclProvider->createAcl($oid);
    }catch(\Exception $e) {
        $acl = $aclProvider->findAcl($oid);
    }
    $aclProvider->updateAcl($acl);
    foreach ($permissionsToCheck as $permissionCode):
        $permissionVar = 'can'.$permissionCode;
        $builder = new MaskBuilder();
        $builder->add($permissionCode);
        $mask = $builder->get();
        try {
            $$permissionVar = $acl->isGranted(array($mask),array($sid));
        } catch(\Exception $e) {
            $$permissionVar = false;
        }
        $tempPermissionsArray[$permissionCode] = $$permissionVar;
    endforeach;
    $returnArray = array('id' => $object->getId(),'title' => $object->getTitle(),'slug' => $object->getSlug(),'type' => $type, 'permissions' => $tempPermissionsArray);
    return $returnArray;
}
после публикации формы я проверяю какой объект имеет измененные разрешения, если это так, я просматриваю всех пользователей в группе. Для каждого пользователя отмените разрешения, затем получите все группы (пользователь по умолчанию для группы ). проверьте разрешения для каждой группы(пользователя по умолчанию), проверьте, какие разрешения активировать и дать пользователю правильные разрешения.
здесь я устанавливаю все разрешения на false, а затем перебираю все роли / группы(пользователи по умолчанию) и вижу, должно ли быть установлено разрешение.
 foreach($array['permissions'] as $permissionCode => $test ):
        $$permissionCode = false;
    endforeach;
    foreach($user->getRoles() as $role):
        $role   = str_replace('ROLE_', '', $role);
        $defaultUser = $this->getDoctrine()
            ->getRepository('TdfUserBundle:User')
            ->findOneByUsername('-default-'.$role);
        $sid = UserSecurityIdentity::fromAccount($defaultUser);
        // See all permissions
        foreach($array['permissions'] as $permissionCode => $test ):
            $builder = new MaskBuilder();
            $builder->add($permissionCode);
            $mask = $builder->get();
            try {
                $isGranted = $acl->isGranted(array($mask),array($sid));
                if($isGranted):
                    $$permissionCode = true;
                endif;
            } catch(\Exception $e) {
            }
        endforeach;
    endforeach;
после этого я знаю, что прав пользователь должен иметь, а затем предоставить учетной записи Все права:
$aclManager = $this->get('problematic.acl_manager');
$aclManager->revokeAllObjectPermissions($object, $user);
$mapping = array(
        'VIEW'      => MaskBuilder::MASK_VIEW,
        'EDIT'      => MaskBuilder::MASK_EDIT,
        'CREATE'    => MaskBuilder::MASK_CREATE,
        'UNDELETE'  => MaskBuilder::MASK_UNDELETE,
        'DELETE'    => MaskBuilder::MASK_DELETE,
        'OPERATOR'  => MaskBuilder::MASK_OPERATOR,
        'MASTER'    => MaskBuilder::MASK_MASTER,
        'OWNER'     => MaskBuilder::MASK_OWNER,
    );
foreach($array['permissions'] as $permissionCode => $test ):
    if($$permissionCode):
        $mask = $mapping[$permissionCode];
        $aclManager->addObjectPermission($object, $mask, $user);
    endif;
endforeach;