Damien Flandrin

Tutoriels, astuces et conseils sur le développement web par un développeur web

8 choses que vous pouvez personnaliser dans Laravel durant la création d'utilisateur

il y a 7 mois · 6 MIN DE LECTURE
#Laravel 

Laravel dispose d'un excellent système Authentification prêt à l'emploi, avec seulement quelques commandes, vous pouvez disposer de fonctions de connexion/enregistrement. Mais plongeons un peu plus profondément et voyons ce que nous pouvons facilement personnaliser.

1. Désactiver la création de compte

Que faire si votre application a des utilisateurs pré-enregistrés, ou s'ils sont créés par l'administrateur, et qu'il n'y a pas d'enregistrement public ?

Depuis Laravel 5.7, il suffit d'ajouter un paramètre dans routes/web.php :

Auth::routes(['register' => false]);

Ensuite, vous ne verrez pas le lien Enregistrer dans le coin supérieur droit, et la route /register affichera la page 404.

2. Activer la vérification des e-mails

Une autre nouveauté de Laravel 5.7 est la vérification des emails, avec le champ database users.email_verified_at. Par défaut, il est désactivé, mais tous les champs et routes nécessaires existe, ils sont juste cachés.

Pour activer cette fonction, il suffit de passer un paramètre dans routes/web.php :

Auth::routes(['verify' => true]);

Aussi, assurez-vous d'exécuter php artisan make:auth pour qu'il génère les vues nécessaires pour que les utilisateurs puissent les voir après avoir cliqué sur les liens de vérification.

Enfin, si vous avez besoin de sécuriser vos routes pour autoriser uniquement les utilisateurs vérifiés, utilisez le Middleware verified :

Route::get('profile', function () {
    // Seuls les utilisateurs vérifiés peuvent entrer ...
})->middleware('verified');

3. Désactiver la réinitialisation du mot de passe

Par défaut, la commande php artisan make:auth génère les pages de login/register Bootstrap, ainsi qu'un processus de réinitialisation du mot de passe oublié.

Mais si vous voulez désactiver cette fonctionnalité, et avoir un autre mécanisme pour récupérer les mots de passe, il y a un autre paramètre dans le fichier routes/web.php à ajouter:

Auth::routes(['reset' => false]);

Remarque : vous pouvez combiner ceci avec les conseils précédents sur l'enregistrement et la vérification, et l'avoir dans votre route/web.php :

Auth::routes([
  'register' => false,
  'verify' => true,
  'reset' => false
]);

Les routes ci-dessous sont listés par une méthode dans vendor/laravel/framework/src/Illuminate/Routing/Router.php :

public function auth(array $options = [])
{
    // Authentication Routes...
    $this->get('login', 'Auth\LoginController@showLoginForm')->name('login');
    $this->post('login', 'Auth\LoginController@login');
    $this->post('logout', 'Auth\LoginController@logout')->name('logout');

    // Registration Routes...
    if ($options['register'] ?? true) {
        $this->get('register', 'Auth\RegisterController@showRegistrationForm')->name('register');
        $this->post('register', 'Auth\RegisterController@register');
    }

    // Password Reset Routes...
    if ($options['reset'] ?? true) {
        $this->resetPassword();
    }

    // Email Verification Routes...
    if ($options['verify'] ?? false) {
        $this->emailVerification();
    }
}

4. Rediriger après l'enregistrement

Par défaut, les nouveaux utilisateurs enregistrés sont redirigés vers URL /home. Peut-être, vous voulez le changer, c'est possible avec le fichier app/Http/Controllers/Auth/RegisterController.php :

class RegisterController extends Controller
{
    /**
     * Where to redirect users after registration.
     *
     * @var string
     */
    protected $redirectTo = '/home';

Il suffit de changer ce paramètre, et c'est tout.

Mais que faire si vous avez une logique plus compliquée qu'une seule URL statique ? Par exemple, vous souhaitez rediriger vers différentes URL en fonction du rôle du nouvel utilisateur. Ensuite, vous pouvez créer une méthode séparée dans la même classe RegisterController, avec le nom redirectTo() :

protected function redirectTo()
{
    if (auth()->user()->role_id == 1) {
        return '/admin';
    }
    return '/home';
}

Le comportement de la méthode écrasera la valeur de propriété $redirectTo, même si la valeur est présente.

5. Modifier les règles de validation d'Authentification

Par défaut, Auth comporte quatre champs :

  • name
  • email
  • password
  • confirm password

Toutes sont obligatoires et ces règles de validation sont spécifiées dans le même app/Http/Controllers/Auth/RegisterController.php :

protected function validator(array $data)
{
    return Validator::make($data, [
        'name' => ['required', 'string', 'max:255'],
        'email' => ['required', 'string', 'email', 'max:255', 'unique:users'],
        'password' => ['required', 'string', 'min:6', 'confirmed'],
    ]);
}

Donc si vous voulez changer l'un de ces éléments, comme ajouter des règles de mot de passe plus compliquées que seulement 6 symboles minimum, il suffit d'éditer cette méthode validator().

6. Désactiver la connexion automatique après l'enregistrement

Un autre comportement par défaut que vous voudrez peut-être modifier est la connexion automatique immédiatement après le formulaire d'inscription. Vous pouvez rediriger votre utilisateur vers une page "succès" distincte et vous attendre à ce qu'il se connecte manuellement plus tard.

Pour ce faire, vous devez remplacer la méthode register() du trait RegistersUsers.

Le contrôleur dont nous avons parlé plus haut, RegisterController, utilise ce trait :

class RegisterController extends Controller
{
    use RegistersUsers;
    // ... 

Ce trait fait tout le "sale boulot" de l'enregistrement. Il fait partie du cadre de base, situé dans le fichier script php : vendor/laravel/framework/src/Illuminate/Foundation/Auth/RegistersUsers.php :

trait RegistersUsers
{
    /**
     * Handle a registration request for the application.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function register(Request $request)
    {
        $this->validator($request->all())->validate();

        event(new Registered($user = $this->create($request->all())));

        $this->guard()->login($user);

        return $this->registered($request, $user)
                        ?: redirect($this->redirectPath());
    }

    // ... Autres méthodes

}

Pour désactiver la connexion automatique, vous devez supprimer cette ligne particulière :

$this->guard()->login($user);

Mais vous ne pouvez pas éditer directement le noyau de Laravel, ni aucune partie de ce qui se trouve à l'intérieur de /vendor. Ce que vous pouvez faire, c'est remplacer la même méthode et la mettre dans votre RegisterController, comme ceci :

namespace App\Http\Controllers\Auth;

// N'OUBLIEZ PAS D'AJOUTER CES DEUX LIGNES
use Illuminate\Http\Request;
use Illuminate\Auth\Events\Registered;

use App\User;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Validator;
use Illuminate\Foundation\Auth\RegistersUsers;

class RegisterController extends Controller
{

    // ... 

    /**
     * Handle a registration request for the application.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function register(Request $request)
    {
        $this->validator($request->all())->validate();

        event(new Registered($user = $this->create($request->all())));

        return $this->registered($request, $user)
            ?: redirect($this->redirectPath());
    }

}

Enfin, prenez soin de rediriger vers le paramètre ou la méthode redirectTo, comme indiqué dans l'astuce précédente, afin que l'utilisateur enregistré arrive sur une page correcte.

7. Ajout de champs supplémentaires au formulaire d'inscription

L'exemple le plus typique serait d'ajouter un champ nom de famille, en plus du nom par défaut. Il y a quelques étapes que vous devez faire ici :

Étape 1. Ajouter un champ à la base de données. Ajoutez simplement cette ligne au fichier de migration : $table->string(‘surname’); ; Vous pouvez éditer le fichier de migration par défaut existant, ou créez-en un nouveau avec `php artisan make:migration add_surname_to_users_table``.

Étape 2. Ajout d'un champ à remplir dans le modèle d'utilisateur.

protected $fillable = [
    'name', 'email', 'password',
];

Vous devez donc ajouter votre nouveau 'nom de famille' dans ce tableau.

protected $fillable = [
    'name', 'surname', 'email', 'password',
];

Étape 3. Ajoutez le champ à la vue register

Vous devez éditer le fichier resources/views/auth/register.blade.php et ajouter votre nouevau champ, vous pouvez vous inspirez du code déjà exsitant pour ajouter le votre.

Étape 4. Modifier la méthode create().

Voici à quoi ressemble la méthode par défaut dans RegisterController :

protected function create(array $data)
{
    return User::create([
        'name' => $data['name'],
        'email' => $data['email'],
        'password' => Hash::make($data['password']),
    ]);
}

Devinez quoi, vous n'avez qu'à ajouter une autre ligne relative au nom de famille, donc le résultat final est le suivant :

protected function create(array $data)
{
    return User::create([
        'name' => $data['name'],
        'surname' => $data['surname'],
        'email' => $data['email'],
        'password' => Hash::make($data['password']),
    ]);
}

8. Connectez-vous avec un nom d'utilisateur au lieu d'un courriel

Par défaut, l'email est le champ le plus important pour l'utilisateur, il est utilisé comme identifiant unique et fait partie des identifiants. Mais que faire si, dans votre cas, le courriel n'est qu'un champ d'information, et que l'authentification de connexion en est un autre, comme le nom d'utilisateur ?

Tout d'abord, prenez soin d'ajouter ce champ dans la base de données/modèle/vues, comme indiqué dans le conseil précédent.

Ensuite, vous devez jeter un oeil à app/Http/Controllers/Auth/LoginController, en particulier un trait :

class LoginController extends Controller
{
    use AuthenticatesUsers;
    // ... 

Si vous allez plus loin dans ce trait /vendor/laravel/framework/src/Illuminate/Foundation/Auth/Auth/AuthenticatesUsers.php, vous verrez une méthode :

/**
 * Get the login username to be used by the controller.
 *
 * @return string
 */
public function username()
{
    return 'email';
}

C'est juste un champ constant renvoyé par une fonction. Et puis il est utilisé dans la validation et l'authentification réelles, dans le même trait :

protected function validateLogin(Request $request)
{
    $request->validate([
        $this->username() => 'required|string',
        'password' => 'required|string',
    ]);
}

Tout ce que vous avez à faire est de remplacer cette méthode dans votre LoginController, comme nous l'avons fait avec le paramètre redirectTo précédemment dans cet article.

class LoginController extends Controller
{
    use AuthenticatesUsers;
    // ...

    public function username()
    {
        return 'username';
    }
}

···

Damien Flandrin

Je suis développeur web pour l'agence Carredas, je fais principalement du PHP avec Laravel et Prestashop.

Développeur Web - Damien Flandrin