Sonata Admin - разрешить показывать только то, что созданный вошедший в систему пользователь создал

настроили интерфейс администратора сонаты, который позволяет пользователям создавать определенный контент, но как я могу ограничить пользователей от редактирования контента, созданного другими пользователями?

Для аргументов, пользователь входит в систему и создает блог. В представлении списка блогов только блогитот созданный пользователь должен отображаться.

В настоящее время все отображается для каждого пользователя - у меня есть настройки групп / ролей, чтобы ограничить доступ к административным областям, что прекрасно работает.

Единственный способ, которым я могу думать в настоящее время, - это отображать только определенный контент пользователей, вошедших в систему, - переопределить шаблоны?

Но, конечно же, это очевидная и простая настройка конфигурации?

Ответы на вопрос(1)

Первый предпочтительный способ заключается в использованииSymfony»с ACL, вотбольше информации, как это работает и как это сделать в Сонате.

Если вы неЕсли вы не хотите использовать ACL, вы можете изменить запросы по умолчанию, добавив некоторое условие в запрос SQL (запрос DQL), например: ГДЕ adminId = 5 ', Это будет больше работы, но я покажу вам базовый пример, как это сделать.

Измените определение ваших услуг администратора в services.xml, добавив новый установщикsetSecurityContext, Я буду использовать admin для распечатки и редактирования некоторых продуктов.

    <service id="acme_demo_admin.product" class="Acme\Bundle\DemoAdminBundle\Admin\ProductAdmin">
        <tag name="sonata.admin" manager_type="orm" group="product_group" label_catalogue="admin" label="Products">
        <argument>
        <argument>Acme\Bundle\DemoAdminBundle\Entity\Product</argument>
        <argument>AcmeDemoAdminBundle:ProductAdmin</argument>

        <call method="setSecurityContext">
            <argument type="service" id="security.context">
        </argument></call>
    </argument></tag></service>

SecurityContext - это сервис, который содержит информацию о зарегистрированном в данный момент пользователе.

В Acme / Bundle / DemoAdminBundle / Admin / ProductAdmin.php добавьте установщик setSecurityContext и измените метод createQuery:

<!--?php

namespace Acme\Bundle\DemoAdminBundle\Admin;

use Symfony\Component\Security\Core\SecurityContextInterface;
// ...

class ProductAdmin extends Admin
{
    /**
     * Security Context
     * @var \Symfony\Component\Security\Core\SecurityContextInterface
     */
    protected $securityContext;

    public function setSecurityContext(SecurityContextInterface $securityContext)
    {
        $this--->securityContext = $securityContext;
    }

    protected function configureRoutes(RouteCollection $collection)
    {
        //remove all routes except those, you are using in admin and you can secure by yourself
        $collection
                ->clearExcept(array(
                    'list',
                    'edit',
                ))
        ;
    }

    public function createQuery($context = 'list')
    {
        $queryBuilder = $this->getModelManager()->getEntityManager($this->getClass())->createQueryBuilder();

        //if is logged admin, show all data
        if ($this->securityContext->isGranted('ROLE_ADMIN')) {
            $queryBuilder->select('p')
                    ->from($this->getClass(), 'p')
             ;
        } else {
            //for other users, show only data, which belongs to them
            $adminId = $this->securityContext->getToken()->getUser()->getAdminId();

            $queryBuilder->select('p')
                    ->from($this->getClass(), 'p')
                    ->where('p.adminId=:adminId')
                    ->setParameter('adminId', $adminId, Type::INTEGER)
            ;
        }

        $proxyQuery = new ProxyQuery($queryBuilder);
        return $proxyQuery;
    }

    //... configureListFields, configureDatagridFilters etc.
}

Пользователи без роли SONATA_ADMIN могут 'не вижу все записи.

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

Вы можете создать свойизбиратель собственной безопасности (предпочтительное решение) или используйте пользовательский контроллер CRUD.

В пользовательском контроллере CRUD: перегрузка Acme / Bundle / DemoAdminBundle / Controller / ProductController.phpeditAction.

<!--?php
    namespace Acme\Bundle\DemoAdminBundle\Controller;

    use Sonata\AdminBundle\Controller\CRUDController as Controller;
    use Symfony\Component\Security\Core\Exception\AccessDeniedException;


    class ProductAdminController extends Controller 
    {
        public function editAction($id = null)
        {
            $request = $this--->getRequest();
            $id = $request->get($this->admin->getIdParameter());

            $securityContext = $this->get('security.context');
            if (!$securityContext->isGranted('ROLE_ADMIN')) {

               $adminId = $securityContext->getToken()->getUser()->getId();

               $accessGranted = //here you should check if user with adminId can edit product with $id

                if (!$accessGranted) {
                    throw new AccessDeniedException(sprintf('Admin ID %s has no access to product with id %s', $adminId, $id));
                }
            }

            return parent::editAction($id);
        }

    }

Как видите, вы можете перегружать множество методов и маршрутов, чтобы добавить любую нужную вам функциональность. Но, как я уже говорил, это больше работы, поэтому вместо перегрузки методов сначала проверьте, является ли ACL Symfony (или просто создание собственного избирателя безопасности) тем, что вам нужно в вашем проекте или нет.

 pulzarraider21 июл. 2013 г., 23:46
В самом деле. Я обновил ответ. Благодарю.
 Pierre de LESPINAY11 июл. 2013 г., 13:34
Для обеспечения доступа, возможно, было бы лучше сИзбиратель.

Ваш ответ на вопрос