From a1691859ca0cb4c1b360c34b05aa74bdba9e582a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicolas=20L=C5=93uillet?= Date: Tue, 18 Aug 2015 11:08:45 +0200 Subject: implement FosUser --- app/AppKernel.php | 1 + app/config/config.yml | 5 + app/config/security.yml | 29 +-- bin/twig-gettext-extractor | 1 - composer.json | 3 +- composer.lock | 144 ++++++++---- src/Wallabag/CoreBundle/Command/InstallCommand.php | 1 + .../CoreBundle/DataFixtures/ORM/LoadUserData.php | 2 + src/Wallabag/CoreBundle/Entity/User.php | 250 +-------------------- .../Resources/views/Security/login.html.twig | 1 + .../views/themes/material/Entry/entries.html.twig | 1 - .../views/themes/material/Security/login.html.twig | 1 + .../Tests/Command/InstallCommandTest.php | 2 +- .../Tests/Controller/ConfigControllerTest.php | 4 +- 14 files changed, 138 insertions(+), 307 deletions(-) delete mode 120000 bin/twig-gettext-extractor diff --git a/app/AppKernel.php b/app/AppKernel.php index 00206ddf..08e14b8f 100644 --- a/app/AppKernel.php +++ b/app/AppKernel.php @@ -17,6 +17,7 @@ class AppKernel extends Kernel new Doctrine\Bundle\DoctrineBundle\DoctrineBundle(), new Sensio\Bundle\FrameworkExtraBundle\SensioFrameworkExtraBundle(), new FOS\RestBundle\FOSRestBundle(), + new FOS\UserBundle\FOSUserBundle(), new JMS\SerializerBundle\JMSSerializerBundle(), new Nelmio\ApiDocBundle\NelmioApiDocBundle(), new Nelmio\CorsBundle\NelmioCorsBundle(), diff --git a/app/config/config.yml b/app/config/config.yml index efc815b8..f623ab23 100644 --- a/app/config/config.yml +++ b/app/config/config.yml @@ -152,3 +152,8 @@ liip_theme: # bundle_resource_dir: # - %%dir%%/views/themes/%%current_theme%%/%%bundle_name%%/%%template%% # - %%dir%%/views/%%bundle_name%%/%%override_path%% + +fos_user: + db_driver: orm + firewall_name: main + user_class: Wallabag\CoreBundle\Entity\User diff --git a/app/config/security.yml b/app/config/security.yml index b9c4cbef..98846656 100644 --- a/app/config/security.yml +++ b/app/config/security.yml @@ -12,6 +12,8 @@ security: providers: administrators: entity: { class: WallabagCoreBundle:User, property: username } + fos_userbundle: + id: fos_user.user_provider.username # the main part of the security, where you can set up firewalls # for specific sections of your app @@ -26,31 +28,12 @@ security: anonymous: ~ secured_area: - pattern: ^/ - anonymous: ~ + pattern: ^/ form_login: - login_path: /login - - use_forward: false - - check_path: /login_check - - post_only: true - - always_use_default_target_path: false - default_target_path: / - target_path_parameter: _target_path - use_referer: true - - failure_path: null - failure_forward: false - - username_parameter: _username - password_parameter: _password - - csrf_parameter: _csrf_token - intention: authenticate + provider: fos_userbundle + csrf_provider: security.csrf.token_manager + anonymous: true remember_me: key: "%secret%" lifetime: 31536000 diff --git a/bin/twig-gettext-extractor b/bin/twig-gettext-extractor deleted file mode 120000 index 0a8959b0..00000000 --- a/bin/twig-gettext-extractor +++ /dev/null @@ -1 +0,0 @@ -../vendor/umpirsky/twig-gettext-extractor/twig-gettext-extractor \ No newline at end of file diff --git a/composer.json b/composer.json index 20bb5537..82fe61bd 100644 --- a/composer.json +++ b/composer.json @@ -52,7 +52,8 @@ "liip/theme-bundle": "~1.1.3", "pagerfanta/pagerfanta": "~1.0.3", "lexik/form-filter-bundle": "~4.0", - "j0k3r/graby": "~1.0" + "j0k3r/graby": "~1.0", + "friendsofsymfony/user-bundle": "dev-master" }, "require-dev": { "doctrine/doctrine-fixtures-bundle": "~2.2.0", diff --git a/composer.lock b/composer.lock index 35d8b978..7dbb3cd8 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", "This file is @generated automatically" ], - "hash": "f5520667cebcae76568ff448172854bd", + "hash": "d457fa385420eb29a177ac38eac977c3", "packages": [ { "name": "doctrine/annotations", @@ -693,16 +693,16 @@ }, { "name": "doctrine/orm", - "version": "v2.5.1", + "version": "v2.5.0", "source": { "type": "git", "url": "https://github.com/doctrine/doctrine2.git", - "reference": "e6a83bedbe67579cb0bfb688e982e617943a2945" + "reference": "aa80c7d2c55a372f5f9f825f5c66dbda53a6e3fe" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/doctrine2/zipball/e6a83bedbe67579cb0bfb688e982e617943a2945", - "reference": "e6a83bedbe67579cb0bfb688e982e617943a2945", + "url": "https://api.github.com/repos/doctrine/doctrine2/zipball/aa80c7d2c55a372f5f9f825f5c66dbda53a6e3fe", + "reference": "aa80c7d2c55a372f5f9f825f5c66dbda53a6e3fe", "shasum": "" }, "require": { @@ -766,7 +766,7 @@ "database", "orm" ], - "time": "2015-08-31 12:59:39" + "time": "2015-04-02 20:40:18" }, { "name": "ezyang/htmlpurifier", @@ -942,6 +942,73 @@ ], "time": "2015-06-16 08:39:26" }, + { + "name": "friendsofsymfony/user-bundle", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://github.com/FriendsOfSymfony/FOSUserBundle.git", + "reference": "336d9cd8ba0c5a462b3e70be144a7bef5377b219" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/FriendsOfSymfony/FOSUserBundle/zipball/336d9cd8ba0c5a462b3e70be144a7bef5377b219", + "reference": "336d9cd8ba0c5a462b3e70be144a7bef5377b219", + "shasum": "" + }, + "require": { + "php": ">=5.3.2", + "symfony/form": "~2.3", + "symfony/framework-bundle": "~2.3", + "symfony/security-bundle": "~2.3", + "symfony/twig-bundle": "~2.3" + }, + "require-dev": { + "doctrine/doctrine-bundle": "~1.3", + "swiftmailer/swiftmailer": "~4.3|~5", + "symfony/validator": "~2.3", + "symfony/yaml": "~2.3", + "willdurand/propel-typehintable-behavior": "~1.0" + }, + "suggest": { + "willdurand/propel-typehintable-behavior": "Needed when using the propel implementation" + }, + "type": "symfony-bundle", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "FOS\\UserBundle\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christophe Coevoet", + "email": "stof@notk.org" + }, + { + "name": "FriendsOfSymfony Community", + "homepage": "https://github.com/friendsofsymfony/FOSUserBundle/contributors" + }, + { + "name": "Thibault Duplessis", + "email": "thibault.duplessis@gmail.com" + } + ], + "description": "Symfony FOSUserBundle", + "homepage": "http://friendsofsymfony.github.com", + "keywords": [ + "User management" + ], + "time": "2015-08-14 09:45:59" + }, { "name": "guzzlehttp/guzzle", "version": "5.3.0", @@ -2673,37 +2740,32 @@ }, { "name": "symfony/assetic-bundle", - "version": "v2.7.0", + "version": "v2.6.1", "source": { "type": "git", "url": "https://github.com/symfony/AsseticBundle.git", - "reference": "3ae5c8ca3079b6e0033cc9fbfb6500e2bc964da5" + "reference": "422b0add2110f0cf9bc7a873a386ea053f4a89f0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/AsseticBundle/zipball/3ae5c8ca3079b6e0033cc9fbfb6500e2bc964da5", - "reference": "3ae5c8ca3079b6e0033cc9fbfb6500e2bc964da5", + "url": "https://api.github.com/repos/symfony/AsseticBundle/zipball/422b0add2110f0cf9bc7a873a386ea053f4a89f0", + "reference": "422b0add2110f0cf9bc7a873a386ea053f4a89f0", "shasum": "" }, "require": { - "kriswallsmith/assetic": "~1.3", + "kriswallsmith/assetic": "~1.2", "php": ">=5.3.0", "symfony/console": "~2.3", "symfony/dependency-injection": "~2.3", "symfony/framework-bundle": "~2.3", "symfony/yaml": "~2.3" }, - "conflict": { - "kriswallsmith/spork": "<=0.2", - "twig/twig": "<1.20" - }, "require-dev": { - "kriswallsmith/spork": "~0.3", + "kriswallsmith/spork": "~0.2", "patchwork/jsqueeze": "~1.0", "symfony/class-loader": "~2.3", "symfony/css-selector": "~2.3", "symfony/dom-crawler": "~2.3", - "symfony/phpunit-bridge": "~2.7", "symfony/twig-bundle": "~2.3" }, "suggest": { @@ -2713,7 +2775,7 @@ "type": "symfony-bundle", "extra": { "branch-alias": { - "dev-master": "2.7-dev" + "dev-master": "2.5-dev" } }, "autoload": { @@ -2739,7 +2801,7 @@ "compression", "minification" ], - "time": "2015-09-01 00:05:29" + "time": "2015-01-27 12:45:16" }, { "name": "symfony/monolog-bundle", @@ -2859,23 +2921,23 @@ }, { "name": "symfony/symfony", - "version": "v2.7.4", + "version": "v2.7.3", "source": { "type": "git", "url": "https://github.com/symfony/symfony.git", - "reference": "1fdf23fe28876844b887b0e1935c9adda43ee645" + "reference": "a9af4708b4bb650c4897e9b8dfbfbdb2ea5f0486" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/symfony/zipball/1fdf23fe28876844b887b0e1935c9adda43ee645", - "reference": "1fdf23fe28876844b887b0e1935c9adda43ee645", + "url": "https://api.github.com/repos/symfony/symfony/zipball/a9af4708b4bb650c4897e9b8dfbfbdb2ea5f0486", + "reference": "a9af4708b4bb650c4897e9b8dfbfbdb2ea5f0486", "shasum": "" }, "require": { "doctrine/common": "~2.3", "php": ">=5.3.9", "psr/log": "~1.0", - "twig/twig": "~1.20|~2.0" + "twig/twig": "~1.18" }, "replace": { "symfony/asset": "self.version", @@ -2977,7 +3039,7 @@ "keywords": [ "framework" ], - "time": "2015-09-08 14:26:39" + "time": "2015-07-31 13:24:45" }, { "name": "tecnick.com/tcpdf", @@ -3044,20 +3106,20 @@ }, { "name": "twig/extensions", - "version": "v1.3.0", + "version": "v1.2.0", "source": { "type": "git", "url": "https://github.com/twigphp/Twig-extensions.git", - "reference": "449e3c8a9ffad7c2479c7864557275a32b037499" + "reference": "8cf4b9fe04077bd54fc73f4fde83347040c3b8cd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/Twig-extensions/zipball/449e3c8a9ffad7c2479c7864557275a32b037499", - "reference": "449e3c8a9ffad7c2479c7864557275a32b037499", + "url": "https://api.github.com/repos/twigphp/Twig-extensions/zipball/8cf4b9fe04077bd54fc73f4fde83347040c3b8cd", + "reference": "8cf4b9fe04077bd54fc73f4fde83347040c3b8cd", "shasum": "" }, "require": { - "twig/twig": "~1.20|~2.0" + "twig/twig": "~1.12" }, "require-dev": { "symfony/translation": "~2.3" @@ -3068,7 +3130,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "1.3-dev" + "dev-master": "1.2.x-dev" } }, "autoload": { @@ -3092,7 +3154,7 @@ "i18n", "text" ], - "time": "2015-08-22 16:38:35" + "time": "2014-10-30 14:30:03" }, { "name": "twig/twig", @@ -3261,7 +3323,7 @@ ], "authors": [ { - "name": "William DURAND", + "name": "William Durand", "email": "william.durand1@gmail.com" } ], @@ -3346,7 +3408,7 @@ ], "authors": [ { - "name": "William DURAND", + "name": "William Durand", "email": "william.durand1@gmail.com" } ], @@ -3828,16 +3890,16 @@ }, { "name": "phpunit/phpunit", - "version": "4.8.6", + "version": "4.8.5", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "2246830f4a1a551c67933e4171bf2126dc29d357" + "reference": "9b7417edaf28059ea63d86be941e6004dbfcc0cc" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/2246830f4a1a551c67933e4171bf2126dc29d357", - "reference": "2246830f4a1a551c67933e4171bf2126dc29d357", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/9b7417edaf28059ea63d86be941e6004dbfcc0cc", + "reference": "9b7417edaf28059ea63d86be941e6004dbfcc0cc", "shasum": "" }, "require": { @@ -3896,7 +3958,7 @@ "testing", "xunit" ], - "time": "2015-08-24 04:09:38" + "time": "2015-08-19 09:20:57" }, { "name": "phpunit/phpunit-mock-objects", @@ -4376,7 +4438,9 @@ ], "aliases": [], "minimum-stability": "dev", - "stability-flags": [], + "stability-flags": { + "friendsofsymfony/user-bundle": 20 + }, "prefer-stable": true, "prefer-lowest": false, "platform": { diff --git a/src/Wallabag/CoreBundle/Command/InstallCommand.php b/src/Wallabag/CoreBundle/Command/InstallCommand.php index 491c67f9..29d91109 100644 --- a/src/Wallabag/CoreBundle/Command/InstallCommand.php +++ b/src/Wallabag/CoreBundle/Command/InstallCommand.php @@ -192,6 +192,7 @@ class InstallCommand extends ContainerAwareCommand $user->setUsername($dialog->ask($this->defaultOutput, 'Username (default: wallabag) :', 'wallabag')); $user->setPassword($dialog->ask($this->defaultOutput, 'Password (default: wallabag) :', 'wallabag')); $user->setEmail($dialog->ask($this->defaultOutput, 'Email:', '')); + $user->setEnabled(true); $em->persist($user); diff --git a/src/Wallabag/CoreBundle/DataFixtures/ORM/LoadUserData.php b/src/Wallabag/CoreBundle/DataFixtures/ORM/LoadUserData.php index 1c7f9dfa..4ef53329 100644 --- a/src/Wallabag/CoreBundle/DataFixtures/ORM/LoadUserData.php +++ b/src/Wallabag/CoreBundle/DataFixtures/ORM/LoadUserData.php @@ -19,6 +19,7 @@ class LoadUserData extends AbstractFixture implements OrderedFixtureInterface $userAdmin->setEmail('bigboss@wallabag.org'); $userAdmin->setUsername('admin'); $userAdmin->setPassword('mypassword'); + $userAdmin->setEnabled(true); $manager->persist($userAdmin); @@ -29,6 +30,7 @@ class LoadUserData extends AbstractFixture implements OrderedFixtureInterface $bobUser->setEmail('bobby@wallabag.org'); $bobUser->setUsername('bob'); $bobUser->setPassword('mypassword'); + $bobUser->setEnabled(true); $manager->persist($bobUser); diff --git a/src/Wallabag/CoreBundle/Entity/User.php b/src/Wallabag/CoreBundle/Entity/User.php index 510a1594..eeae331e 100644 --- a/src/Wallabag/CoreBundle/Entity/User.php +++ b/src/Wallabag/CoreBundle/Entity/User.php @@ -10,6 +10,7 @@ use Symfony\Component\Security\Core\User\AdvancedUserInterface; use Symfony\Component\Validator\Constraints as Assert; use JMS\Serializer\Annotation\ExclusionPolicy; use JMS\Serializer\Annotation\Expose; +use FOS\UserBundle\Model\User as BaseUser; /** * User. @@ -22,7 +23,7 @@ use JMS\Serializer\Annotation\Expose; * @UniqueEntity("email") * @UniqueEntity("username") */ -class User implements AdvancedUserInterface, \Serializable +class User extends BaseUser implements AdvancedUserInterface, \Serializable { /** * @var int @@ -32,100 +33,49 @@ class User implements AdvancedUserInterface, \Serializable * @ORM\Id * @ORM\GeneratedValue(strategy="AUTO") */ - private $id; - - /** - * @var string - * - * @ORM\Column(name="username", type="text") - * @Assert\NotBlank() - * @Assert\Length( - * min = "3", - * max = "255" - * ) - */ - private $username; - - /** - * @var string - * - * @ORM\Column(type="string", length=32) - */ - private $salt; - - /** - * @var string - * - * @ORM\Column(name="password", type="text") - */ - private $password; + protected $id; /** * @var string * * @ORM\Column(name="name", type="text", nullable=true) */ - private $name; - - /** - * @var string - * - * @ORM\Column(name="email", type="text", nullable=false) - * @Assert\Email() - * @Assert\NotBlank() - */ - private $email; - - /** - * @ORM\Column(name="is_active", type="boolean", nullable=false) - */ - private $isActive = true; - - /** - * @ORM\Column(name="confirmation_token", type="string", nullable=true) - */ - private $confirmationToken; - - /** - * @ORM\Column(name="password_requested_at", type="datetime", nullable=true) - */ - private $passwordRequestedAt; + protected $name; /** * @var date * * @ORM\Column(name="created_at", type="datetime") */ - private $createdAt; + protected $createdAt; /** * @var date * * @ORM\Column(name="updated_at", type="datetime") */ - private $updatedAt; + protected $updatedAt; /** * @ORM\OneToMany(targetEntity="Entry", mappedBy="user", cascade={"remove"}) */ - private $entries; + protected $entries; /** * @ORM\OneToOne(targetEntity="Config", mappedBy="user") */ - private $config; + protected $config; /** * @ORM\OneToMany(targetEntity="Tag", mappedBy="user", cascade={"remove"}) */ - private $tags; + protected $tags; public function __construct() { - $this->isActive = true; - $this->salt = md5(uniqid(null, true)); - $this->entries = new ArrayCollection(); - $this->tags = new ArrayCollection(); + parent::__construct(); + $this->entries = new ArrayCollection(); + $this->tags = new ArrayCollection(); } /** @@ -141,56 +91,6 @@ class User implements AdvancedUserInterface, \Serializable $this->updatedAt = new \DateTime(); } - /** - * Get id. - * - * @return int - */ - public function getId() - { - return $this->id; - } - - /** - * Set username. - * - * @param string $username - * - * @return User - */ - public function setUsername($username) - { - $this->username = $username; - - return $this; - } - - /** - * Get username. - * - * @return string - */ - public function getUsername() - { - return $this->username; - } - - /** - * {@inheritdoc} - */ - public function getSalt() - { - return $this->salt; - } - - /** - * {@inheritdoc} - */ - public function getRoles() - { - return array('ROLE_USER'); - } - /** * Set password. * @@ -209,16 +109,6 @@ class User implements AdvancedUserInterface, \Serializable return $this; } - /** - * Get password. - * - * @return string - */ - public function getPassword() - { - return $this->password; - } - /** * Set name. * @@ -243,30 +133,6 @@ class User implements AdvancedUserInterface, \Serializable return $this->name; } - /** - * Set email. - * - * @param string $email - * - * @return User - */ - public function setEmail($email) - { - $this->email = $email; - - return $this; - } - - /** - * Get email. - * - * @return string - */ - public function getEmail() - { - return $this->email; - } - /** * @return string */ @@ -322,56 +188,12 @@ class User implements AdvancedUserInterface, \Serializable { return $this->tags; } - /** - * {@inheritdoc} - */ - public function eraseCredentials() - { - } - - /** - * @see \Serializable::serialize() - */ - public function serialize() - { - return serialize(array( - $this->id, - )); - } - - /** - * @see \Serializable::unserialize() - */ - public function unserialize($serialized) - { - list( - $this->id) = unserialize($serialized); - } public function isEqualTo(UserInterface $user) { return $this->username === $user->getUsername(); } - public function isAccountNonExpired() - { - return true; - } - - public function isAccountNonLocked() - { - return true; - } - - public function isCredentialsNonExpired() - { - return true; - } - - public function isEnabled() - { - return $this->isActive; - } /** * Set config. * @@ -395,52 +217,4 @@ class User implements AdvancedUserInterface, \Serializable { return $this->config; } - - /** - * Set confirmationToken. - * - * @param string $confirmationToken - * - * @return User - */ - public function setConfirmationToken($confirmationToken) - { - $this->confirmationToken = $confirmationToken; - - return $this; - } - - /** - * Get confirmationToken. - * - * @return string - */ - public function getConfirmationToken() - { - return $this->confirmationToken; - } - - /** - * Set passwordRequestedAt. - * - * @param \DateTime $passwordRequestedAt - * - * @return User - */ - public function setPasswordRequestedAt($passwordRequestedAt) - { - $this->passwordRequestedAt = $passwordRequestedAt; - - return $this; - } - - /** - * Get passwordRequestedAt. - * - * @return \DateTime - */ - public function getPasswordRequestedAt() - { - return $this->passwordRequestedAt; - } } diff --git a/src/Wallabag/CoreBundle/Resources/views/Security/login.html.twig b/src/Wallabag/CoreBundle/Resources/views/Security/login.html.twig index f669574e..5437d20c 100644 --- a/src/Wallabag/CoreBundle/Resources/views/Security/login.html.twig +++ b/src/Wallabag/CoreBundle/Resources/views/Security/login.html.twig @@ -30,6 +30,7 @@
+ Forgot your password?
diff --git a/src/Wallabag/CoreBundle/Resources/views/themes/material/Entry/entries.html.twig b/src/Wallabag/CoreBundle/Resources/views/themes/material/Entry/entries.html.twig index 3711f6e5..1ecaecc5 100644 --- a/src/Wallabag/CoreBundle/Resources/views/themes/material/Entry/entries.html.twig +++ b/src/Wallabag/CoreBundle/Resources/views/themes/material/Entry/entries.html.twig @@ -58,7 +58,6 @@ {% endfor %} -
diff --git a/src/Wallabag/CoreBundle/Resources/views/themes/material/Security/login.html.twig b/src/Wallabag/CoreBundle/Resources/views/themes/material/Security/login.html.twig index 2c513ffe..c9979198 100644 --- a/src/Wallabag/CoreBundle/Resources/views/themes/material/Security/login.html.twig +++ b/src/Wallabag/CoreBundle/Resources/views/themes/material/Security/login.html.twig @@ -44,6 +44,7 @@
+