Bladeren bron

added a user provider for Doctrine MongoDB

Fabien Potencier 14 jaren geleden
bovenliggende
commit
a4fbf74593

+ 0 - 1
src/Symfony/Bundle/DoctrineBundle/Security/EntityUserProvider.php

@@ -2,7 +2,6 @@
 
 namespace Symfony\Bundle\DoctrineBundle\Security;
 
-use Doctrine\ORM\EntityRepository;
 use Symfony\Component\Security\User\UserProviderInterface;
 use Symfony\Component\Security\Exception\UsernameNotFoundException;
 

+ 6 - 1
src/Symfony/Bundle/DoctrineMongoDBBundle/Resources/config/mongodb.xml

@@ -41,6 +41,9 @@
     <parameter key="doctrine.odm.mongodb.xml_mapping_dirs">%doctrine.odm.mongodb.mapping_dirs%</parameter>
     <parameter key="doctrine.odm.mongodb.yml_mapping_dirs">%doctrine.odm.mongodb.mapping_dirs%</parameter>
     <parameter key="doctrine.odm.mongodb.document_dirs" type="collection"></parameter>
+
+    <!-- security/user -->
+    <parameter key="security.user.provider.document.class">Symfony\Bundle\DoctrineMongoDBBundle\Security\DocumentUserProvider</parameter>
   </parameters>
 
   <services>
@@ -75,5 +78,7 @@
       <tag name="data_collector" />
       <argument type="service" id="doctrine.odm.mongodb.logger" />
     </service>
+
+    <service id="security.user.document_manager" alias="doctrine.odm.mongodb.default_document_manager" />
   </services>
-</container>
+</container>

+ 40 - 0
src/Symfony/Bundle/DoctrineMongoDBBundle/Security/DocumentUserProvider.php

@@ -0,0 +1,40 @@
+<?php
+
+namespace Symfony\Bundle\DoctrineMongoDBBundle\Security;
+
+use Symfony\Component\Security\User\UserProviderInterface;
+use Symfony\Component\Security\Exception\UsernameNotFoundException;
+
+class DocumentUserProvider implements UserProviderInterface
+{
+    protected $repository;
+    protected $property;
+
+    public function __construct($em, $class, $property = null)
+    {
+        $this->repository = $em->getRepository($class);
+        $this->property = $property;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public function loadUserByUsername($username)
+    {
+        if (null !== $this->property) {
+            $user = $this->repository->findOneBy(array($this->property => $username));
+        } else {
+            if (!$this->repository instanceof UserProviderInterface) {
+                throw new \InvalidArgumentException(sprintf('The Doctrine repository "%s" must implement UserProviderInterface.', get_class($this->repository)));
+            }
+
+            $user = $this->repository->loadUserByUsername($username);
+        }
+
+        if (null === $user) {
+            throw new UsernameNotFoundException(sprintf('User "%s" not found.', $username));
+        }
+
+        return $user;
+    }
+}

+ 13 - 0
src/Symfony/Bundle/FrameworkBundle/DependencyInjection/SecurityExtension.php

@@ -372,6 +372,19 @@ class SecurityExtension extends Extension
             return array($name, $encoder);
         }
 
+        // Doctrine Document DAO provider
+        if (isset($provider['document'])) {
+            $container
+                ->register($name, '%security.user.provider.document.class%')
+                ->setArguments(array(
+                    new Reference('security.user.document_manager'),
+                    $provider['document']['class'],
+                    isset($provider['document']['property']) ? $provider['document']['property'] : null,
+            ));
+
+            return array($name, $encoder);
+        }
+
         // In-memory DAO provider
         $definition = $container->register($name, '%security.user.provider.in_memory.class%');
         foreach ($this->fixConfig($provider, 'user') as $username => $user) {