Фильтровать 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 );
}
Удачи!