commit 083c3862334dbdbdf0ca05c802f221a065917cae
parent a5209d9be97d99358f3ab4bf434ae8fbee06e47f
Author: Felicitus <felicitus@felicitus.org>
Date: Mon, 12 Oct 2015 13:13:26 +0200
Added legacy user provider to authenticate existing users w/ md5 hashes
Diffstat:
3 files changed, 105 insertions(+), 7 deletions(-)
diff --git a/app/config/config_partkeepr.yml b/app/config/config_partkeepr.yml
@@ -1,4 +1,9 @@
services:
+ partkeepr_legacy_user_provider:
+ class: PartKeepr\AuthBundle\Security\User\LegacyUserProvider
+ arguments:
+ - "@doctrine.orm.default_entity_manager"
+
footprint.category_path_listener:
class: PartKeepr\FootprintBundle\Listeners\CategoryPathListener
arguments:
diff --git a/src/PartKeepr/AuthBundle/Entity/User.php b/src/PartKeepr/AuthBundle/Entity/User.php
@@ -4,6 +4,8 @@ namespace PartKeepr\AuthBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use PartKeepr\DoctrineReflectionBundle\Annotation\TargetService;
use PartKeepr\Util\BaseEntity;
+use Symfony\Component\Security\Core\User\EquatableInterface;
+use Symfony\Component\Security\Core\User\UserInterface;
use Symfony\Component\Serializer\Annotation\Groups;
use Symfony\Component\Validator\Constraints as Assert;
@@ -14,7 +16,7 @@ use Symfony\Component\Validator\Constraints as Assert;
* uniqueConstraints={@ORM\UniqueConstraint(name="username_provider", columns={"username", "provider_id"})})
* @TargetService(uri="/api/users")
*/
-class User extends BaseEntity
+class User extends BaseEntity implements UserInterface, EquatableInterface
{
/**
* @ORM\Column(length=50)
@@ -40,6 +42,13 @@ class User extends BaseEntity
private $admin;
/**
+ * Marks a user as a legacy user (=old md5 auth)
+ * @ORM\Column(type="boolean")
+ * @var boolean
+ */
+ private $legacy;
+
+ /**
* @ORM\Column(type="datetime",nullable=true)
*/
private $lastSeen;
@@ -240,6 +249,22 @@ class User extends BaseEntity
}
/**
+ * Returns if the user is a legacy user
+ * @return bool
+ */
+ public function isLegacy () {
+ return $this->legacy;
+ }
+
+ /**
+ * Marks a user as a legacy user
+ * @param bool|true $legacy
+ */
+ public function setLegacy ($legacy = true) {
+ $this->legacy = $legacy;
+ }
+
+ /**
* Retrieve the last seen flag for a user.
*
* @return \DateTime
@@ -249,13 +274,28 @@ class User extends BaseEntity
return $this->lastSeen;
}
- /**
- * Unserializes the user.
- *
- * @param string $serialized
- */
- public function unserialize($serialized)
+ public function getRoles () {
+ return array();
+ }
+
+ public function getSalt () {
+ return "";
+ }
+
+ public function eraseCredentials () {
+
+ }
+
+ public function isEqualTo(UserInterface $user)
{
+ if (!$user instanceof User) {
+ return false;
+ }
+
+ if ($this->getUsername() != $user->getUsername()) {
+ return false;
+ }
+ return true;
}
}
diff --git a/src/PartKeepr/AuthBundle/Security/User/LegacyUserProvider.php b/src/PartKeepr/AuthBundle/Security/User/LegacyUserProvider.php
@@ -0,0 +1,53 @@
+<?php
+namespace PartKeepr\AuthBundle\Security\User;
+
+
+use Doctrine\ORM\EntityManager;
+use PartKeepr\AuthBundle\Entity\User;
+use Symfony\Component\Security\Core\Exception\UnsupportedUserException;
+use Symfony\Component\Security\Core\Exception\UsernameNotFoundException;
+use Symfony\Component\Security\Core\User\UserInterface;
+use Symfony\Component\Security\Core\User\UserProviderInterface;
+
+class LegacyUserProvider implements UserProviderInterface
+{
+ /**
+ * @var EntityManager
+ */
+ private $entityManager;
+
+ public function __construct (EntityManager $entityManager) {
+ $this->entityManager = $entityManager;
+ }
+
+ public function loadUserByUsername($username)
+ {
+ $repository = $this->entityManager->getRepository("PartKeepr\\AuthBundle\\Entity\\User");
+
+ $user = $repository->findOneBy(array("username" => $username, "legacy" => true));
+
+ if ($user !== null) {
+ return $user;
+ }
+
+ throw new UsernameNotFoundException(
+ sprintf('Username "%s" does not exist.', $username)
+ );
+ }
+
+ public function refreshUser(UserInterface $user)
+ {
+ if (!$user instanceof User) {
+ throw new UnsupportedUserException(
+ sprintf('Instances of "%s" are not supported.', get_class($user))
+ );
+ }
+
+ return $this->loadUserByUsername($user->getUsername());
+ }
+
+ public function supportsClass($class)
+ {
+ return $class === 'PartKeepr\\AuthBundle\\Entity\\User';
+ }
+}