【问题标题】:FIlter the Symfony2 Admin Generator过滤 Symfony2 管理生成器
【发布时间】:2014-01-02 15:37:37
【问题描述】:

大家好,我需要处理管理生成器的数据,我一直在阅读文档,但这对我没有帮助。我需要一个用户只能看到他的组的信息,不能更多。

这是我的 generator.yml

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: ~

希望这里有人可以帮助我

【问题讨论】:

    标签: symfony filtering propel admin-generator


    【解决方案1】:

    仔细查看Security part of documentation 我认为您应该使用凭据。

    显示/编辑/删除操作

    编辑您的 yml 文件并为您想要保护的所有对象操作添加凭据功能(检查 ifOwnedByGroupSameAsCurrentUser ?)。也许你有更好的名字;)

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

    现在定义函数。在同一个 Bundle 内(不使用外部包)定义 Security 类:

    // 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 );
    }
    

    祝你好运!

    【讨论】:

      【解决方案2】:

      我使用的解决方案是在方法 Query 上覆盖 List Controller。在这里您可以设置您的个人查询并进行任何修改。

      【讨论】:

      • 我认为您的意思是生成用于用户修改目的的方法 processQuery。对于编辑/新建控制器,您还可以使用 PreSavePostSave 方法,非常方便。仍然看一下文档的安全部分。这就是管理权限的“方式”。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-05
      • 2010-11-21
      • 2011-06-21
      • 2014-07-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多