damienharper / user-bundle
User Bundle
Installs: 9 656
Dependents: 0
Suggesters: 0
Security: 0
Stars: 3
Watchers: 2
Forks: 1
Open Issues: 1
Type:symfony-bundle
Requires
- php: ^7.3
- doctrine/orm: ^2.7
- symfony/form: ^4.3|^5.0
- symfony/framework-bundle: ^4.3|^5.0
- symfony/mailer: ^4.3|^5.0
- symfony/routing: ^4.3|^5.0
- symfony/security-bundle: ^4.3|^5.0
- symfony/twig-bundle: ^4.3|^5.0
- twig/twig: ^3.0
Requires (Dev)
- friendsofphp/php-cs-fixer: ^2.15
- phpstan/phpstan: ^0.12
- phpstan/phpstan-doctrine: ^0.12
- phpstan/phpstan-symfony: ^0.12
- symfony/validator: ^4.3|^5.0
Suggests
- scheb/two-factor-bundle: Two factor authentication bundle
- symfony/validator: To use validation on ExtendedUserTrait
Conflicts
- doctrine/persistence: <1.3
README
This bundle, simple yet convenient, lets you easily add to your application features such as:
- user authentication
- password resetting
- user account locking
- user account expiration
- force a user to reset his password at first connection
Notes:
- this bundle assumes you're using Doctrine to persist and retrieve your users. It provides a Doctrine UserProvider.
- if you need two factor authentication (2FA), this bundle plays nicely with TwoFactorBundle
- this bundle is inspired by FOSUserBundle
Installation
Applications that use Symfony Flex
Open a command console, enter your project directory and execute:
$ composer require damienharper/user-bundle
Applications that don't use Symfony Flex
Step 1: Download the Bundle
Open a command console, enter your project directory and execute the following command to download the latest stable version of this bundle:
$ composer require damienharper/user-bundle
This command requires you to have Composer installed globally, as explained in the installation chapter of the Composer documentation.
Step 2: Enable the Bundle
Then, enable the bundle by adding it to the list of registered bundles
in the app/AppKernel.php
file of your project:
<?php // app/AppKernel.php // ... class AppKernel extends Kernel { public function registerBundles() { $bundles = array( // ... new DH\UserBundle\DHUserBundle(), ); // ... } // ... }
Configuration
Note: following configuration instructions target a Symfony 4 application.
Step 1: Configure the bundle
Create a file named dh_user.yaml
in the config/packages
directory with the following content.
# config/packages/dh_user.yaml dh_user: user_class: App\Entity\User # FQDN name of your user class password_reset: email_from: john.doe@gmail.com # Sender of the password reset requests token_ttl: 7200 # TTL of a password reset request
Notes:
- By default, the bundle assumes your User class name is
App\Entity\User
Step 2: Setup routes
Edit the config/routes.yaml
file and add the following import rules.
# config/routes.yaml dh_userbundle: resource: "@DHUserBundle/Controller/" type: annotation
Then, you'll have basic pages for logging in, requesting a password reset, resetting a password.
Step 3: Enable the bundle for your firewall
Edit the config/packages/security.yaml
file and add the appropriate blocks/rules as shown below, in this
minimal configuration example.
# config/packages/security.yaml security: encoders: App\Entity\User: algorithm: bcrypt role_hierarchy: ROLE_ADMIN: ROLE_USER ROLE_SUPER_ADMIN: ROLE_ADMIN providers: user_provider: id: dh_userbundle.user_provider firewalls: dev: pattern: ^/(_(profiler|wdt)|css|images|js)/ security: false main: pattern: ^/ provider: user_provider user_checker: dh_userbundle.user_checker anonymous: true form_login: login_path: dh_userbundle_login check_path: dh_userbundle_login logout: true # Easy way to control access for large sections of your site # Note: Only the *first* access control that matches will be used access_control: - { path: ^/login, role: IS_AUTHENTICATED_ANONYMOUSLY } - { path: ^/password-reset, role: IS_AUTHENTICATED_ANONYMOUSLY } - { path: ^/lost-password, role: IS_AUTHENTICATED_ANONYMOUSLY } - { path: ^/admin/, role: ROLE_ADMIN }
Step 4: Create (or update) your User class
The User class has to be an entity (the Doctrine way) which means a simple class containing properties mapped to columns of a table in the database.
Your User class has to implement a few interfaces to make it work with the bundle:
DH\UserBundle\Security\UserInterface
which lists the methods expected to be callable by the bundle\Serializable
regarding serialization/deserialization of User instances
In addition, a few properties are required by the bundle and as a convenience, the bundle provides you two traits you
can use
in your User class to minimize your work:
DH\UserBundle\Model\ExtendedUserTrait
contains all the properties and methods required by the bundle.DH\UserBundle\Model\UserTrait
only contains the minimal, it's up to you to implement the remaining required properties and methods (you can then use theExtendedUserTrait
as an example)
Example of a User class using ExtendedUserTrait
<?php namespace App\Entity; use DH\UserBundle\Model\ExtendedUserTrait; use DH\UserBundle\Security\UserInterface; use Doctrine\ORM\Mapping as ORM; use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity; use Symfony\Component\Validator\Constraints as Assert; /** * @ORM\Entity(repositoryClass="App\Repository\UserRepository") * @ORM\Table(name="user") * @UniqueEntity(fields="email", message="Email already registered.") * @UniqueEntity(fields="username", message="Username already registered.") */ class User implements UserInterface, \Serializable { use ExtendedUserTrait; /** * @ORM\Id * @ORM\GeneratedValue * @ORM\Column(type="integer") */ private $id; /** * @ORM\Column(type="string") * @Assert\NotBlank() */ private $fullName; public function getId(): int { return $this->id; } public function setFullName(string $fullName): void { $this->fullName = $fullName; } public function getFullName(): ?string { return $this->fullName; } }
License
UserBundle is free to use and is licensed under the MIT license