Фильтровать Symfony2 Admin Generator

Привет всем, мне нужно манипулировать данными генератора администратора. Я читал документацию, но это не помогло мне. Мне нужно, чтобы пользователь мог видеть только информацию своей группы и не более.

вот мой генератор.

generator: admingenerator.generator.propel
params:
model: Velfasa\SoporteBundle\Model\Usuario
namespace_prefix: Velfasa
concurrency_lock: ~
bundle_name: SoporteBundle
pk_requirement: ~
fields: ~
object_actions:
    delete: ~
batch_actions:
    delete: ~
builders:
list:
    params:
        title: Lista de usuarios
        display: [ nombre, apellido, dpi, username, direccion, fecha_de_nacimiento]
        actions:
            new:
                route: usuario_registro
        object_actions:
            edit:
                route: usuario_editar
            delete: ~
            show: 
                route: usuario_visualizar
filters:
    params:
        display: [nombre, email, apellido, dpi, username, direccion, fecha_de_nacimiento]
new:
    params:
        title: Nuevo usuario
        display: ~
        actions:
            save: ~
            list: ~
edit:
    params:
        title: Editar
        display: ~
        actions:
            save: ~
            list: ~
show:
    params:
        title: Vista general
        display: ~
        actions:
            list: ~
            new: ~
actions:
    params:
        object_actions:
            delete: ~
        batch_actions:
            delete: ~

Я ожидаю, что кто-то здесь может помочь мне

2 ответа

Решение, которое я использовал, - переписать контроллер списков в методе Query. Здесь вы можете задать свой личный запрос с любой модификацией.

Посмотрите внимательно на часть документации по безопасности, я думаю, вы должны использовать учетные данные.

Показать / изменить / удалить действия

Отредактируйте свой файл yml и добавьте функцию учетных данных для всех действий с объектами, которые вы хотите защитить (проверьте ifOwnedByGroupSameAsCurrentUser?). Может быть, вы пришли с лучшим именем;)

# ...
params:
    # ...
    object_actions:
        show:
            credentials: 'ifOwnedByGroupSameAsCurrentUser(object)'
        edit:
            credentials: 'ifOwnedByGroupSameAsCurrentUser(object)'
        delete:
            credentials: 'ifOwnedByGroupSameAsCurrentUser(object)' 
    # ...

Теперь определите функцию. Внутри того же пакета (не работает с внешним пакетом) определите класс безопасности:

// src/MyPrefix/MyBundle/Security/AccessEvaluator.php
<?php

namespace MyPrefix\MyBundle\Security;

use Symfony\Component\DependencyInjection\ContainerInterface;
use JMS\DiExtraBundle\Annotation as DI;

/**
 * @DI\Service
 */
class AccessEvaluator
{

    private $container;

    /**
     * @DI\InjectParams({
     *     "container" = @DI\Inject("service_container"),
     * })
     */
    public function __construct( ContainerInterface $container )
    {
        $this->container = $container;
    }

    /**
     * @DI\SecurityFunction("ifOwnedByGroupSameAsCurrentUser")
     */
    public function ifOwnedByGroupSameAsCurrentUser( $object )
    {
        // Get current user
        $user = $this->getCurrentUser();

        //
        // THIS IS THE MAGIC
        // change this part to check if user and object has the same group related
        // I assumed that the object has one related group and user can have more groups
        // 
        if( in_array( $object->getGroup(), $user->getGroups() ) )
        {
            return true;
        }

        // this function must return a boolean value
        return false;
    }

    protected function getCurrentUser()
    {
        // I use fos user bundle
        // replace with your own "get user" code
        $userManager = $this->container->get( 'fos_user.user_manager' );
        $user = $userManager->findUserByUsername( $this->container->get( 'security.context' )->getToken()->getUser() );

        return $user;
    }
}

Список действий

Для защиты List Action вам нужно отредактировать ListController и переопределить функцию processQuery. Эта функция сделана для этой цели, поэтому не стоит беспокоиться. И правильный способ ограничения доступа - использовать методы AdminGenerator Filter:

// src/MyPrefix/MyBundle/Controller/MyController/ListController.php
// ...
protected function processFilters( $query )
{
    // Get current user
    $userManager = $this->get( 'fos_user.user_manager' );
    $user = $userManager->findUserByUsername( $this->get( 'security.context' )->getToken()->getUser() );

    $filterObject = $this->getFilters();
    $queryFilter = $this->getQueryFilter();
    $queryFilter->setQuery( $query );
    //
    // THIS IS THE MAGIC
    // change this part to check if user and object has the same group related
    // I assumed that the object has one related group and user can have more groups
    //        
    foreach( $user->getGroups() as $group )
    {
        $queryFilter->addEntityFilter( 'group', $group );
    }
    parent::processFilters( $query );
}

Удачи!

Другие вопросы по тегам