Comment désactiver l'enregistrement des nouveaux utilisateurs dans Laravel


130

J'utilise Laravel (v5).

J'ai besoin d'un utilisateur et je l'ai déjà enregistré. Maintenant, je veux désactiver l'enregistrement pour les nouveaux utilisateurs. Bien sûr, j'ai besoin du formulaire de connexion pour fonctionner.

Comment puis je faire ça?


Supprimez simplement les méthodes liées au registre de votre fichier routes.php . Ne remplacez pas les méthodes par des méthodes vides - c'est une approche horrible et hack-y car vous devez ensuite rajouter les corps si vous décidez de réactiver cette fonctionnalité à l'avenir.
Martin Bean

1
@MartinBean il n'y a pas de routes routes.php. Pour activer les fonctions d'authentification, il vous suffit d'ajouter Route::auth();au fichier.
miken32

@ miken32 Mon commentaire remonte à plus de cinq mois, avant que le Route::auth()raccourci ne soit préconisé.
Martin Bean

5
si vous êtes dans laravel 5.5 et plus Auth::routes(['register' => false]);dans web.php
Manojkiran.A

Réponses:


235

Laravel 5.7 a introduit les fonctionnalités suivantes:

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

Les options actuellement possibles ici sont:

Auth::routes([
  'register' => false, // Registration Routes...
  'reset' => false, // Password Reset Routes...
  'verify' => false, // Email Verification Routes...
]);

Pour les anciennes versions de Laravel, il suffit de remplacer showRegistrationForm()et de register()méthodes dans

  • AuthController pour Laravel 5.0 - 5.4
  • Auth/RegisterController.php pour Laravel 5.5
public function showRegistrationForm()
{
    return redirect('login');
}

public function register()
{

}

5
Il peut être judicieux de changer également la fonction create () en: throw new Exception ('Registration not possible');
le JinX

2
ou vous pouvez ajouter abort(404)lefunction register()
William Notowidagdo

3
Je ne recommanderais pas cette approche, car surcharger du code pour supprimer une fonctionnalité n'est jamais une bonne chose. N'enregistrez pas les itinéraires liés à l'enregistrement.
Martin Bean

4
Pour Laravel 5.5, mettez ceci dansAuth/RegisterController.php
kapoko

7
Dans Laravel 5.7, la showRegistrationForm()fonction est dans le vendordossier, techniquement, il n'est pas recommandé de modifier les fichiers dans le dossier du fournisseur. Fondamentalement, ce que je recommande est de supprimer la route de registre web.php. Vous pouvez simplement dire Auth::routes(['register' => false])dans le web.phpfichier. À votre santé!
Ahamed Rasheed

55

Si vous utilisez Laravel 5.2 et que vous avez installé la fonctionnalité relative à l'authentification avec, php artisan make:authvotre app/Http/routes.phpfichier comprendra toutes les routes liées à l'authentification en appelant simplement Route::auth().

La méthode auth () se trouve dans vendor/laravel/framework/src/Illuminate/Routing/Router.php. Donc, si vous voulez faire ce que certaines personnes suggèrent ici et désactiver l'enregistrement en supprimant les routes indésirables (probablement une bonne idée), vous devez copier les routes que vous voulez toujours de la méthode auth () et les mettre app/Http/routes.php(en remplaçant l'appel à Route :: auth ()). Donc par exemple:

<?php
// This is app/Http/routes.php

// Authentication Routes...
Route::get('login', 'Auth\AuthController@showLoginForm');
Route::post('login', 'Auth\AuthController@login');
Route::get('logout', 'Auth\AuthController@logout');

// Registration Routes... removed!

// Password Reset Routes...
Route::get('password/reset/{token?}', 'Auth\PasswordController@showResetForm');
Route::post('password/email', 'Auth\PasswordController@sendResetLinkEmail');
Route::post('password/reset', 'Auth\PasswordController@reset');

Si vous utilisez une version inférieure à 5.2, alors c'est probablement différent, je me souviens que les choses ont beaucoup changé depuis la version 5.0, à un moment donné, il artisan make:autha même été supprimé IIRC.


Au lieu de supprimer les routes d'enregistrement, est-il possible de les activer uniquement pour un type particulier d'utilisateurs?
Sefran2

@ Sefran2 Vous pouvez y parvenir en associant des groupes à un middleware. Découvrez laravel.com/docs/5.2/routing#route-groups
Rafał G.

Tout d'abord, j'ai essayé Route::group(['middleware' => 'auth'], function () { Route::get('register', 'Auth\AuthController@showRegistrationForm'); Route::post('register', 'Auth\AuthController@register'); });, mais lorsque l'utilisateur connecté demande, /registeril est redirigé vers/
Sefran2

1
@ Sefran2 C'est parce que AuthController appelle (via d'autres classes et traits, c'est un peu alambiqué) le middleware App\Http\Middleware\RedirectIfAuthenticated. Et ce middleware vous redirige vers /si vous êtes déjà connecté. Ce qui est logique, pourquoi voudriez-vous vous inscrire si vous êtes connecté? :-) Si vous souhaitez autoriser uniquement certaines routes à certains types d'utilisateurs, vous devrez créer votre propre middleware au lieu de['middleware' => 'auth']
Rafał G.

2
Pour 5.3, ils sont encore une fois différents, mais peuvent toujours être trouvés dans vendor / laravel / framework / src / Illuminate / Routing / Router.php
Matthieu

51

Cela peut être nouveau dans la version 5.7, mais il existe maintenant un tableau d'options pour la méthode auth. Changer simplement

Auth::routes();

à

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

dans votre fichier de routes après l'exécution php artisan make:authdésactivera l'enregistrement des utilisateurs.


1
Merci pour cela, je ne sais pas depuis quelle version il existe, mais je pense que c'est le bon chemin pour désactiver la partie enregistrement!
Olivier Rochaix

Il a été ajouté en 5.7.
Džuris

34

Pour Laravel 5.3 et 5.4, voici la bonne façon de le faire:

Vous devez changer:

public function __construct()
    {
        $this->middleware('guest');
    }

à

public function __construct()
    {
        $this->middleware('auth');
    }

dans app / Http / Controller / Auth / RegisterController.php


1
Bon travail! Je pense que cette façon protège également de la demande POST pour créer un utilisateur via la poste?
Gediminas

3
cela permettra aux utilisateurs enregistrés de voir la page d'inscription dont vous ne voudriez pas
ahmed

2
Utilisez le middleware ("auth") puis le middleware ("guest") pour contourner la page d'inscription pour tout le monde
user3425867

1
un utilisateur authentifié peut alors enregistrer un nouvel utilisateur dans ce cas.
Muhammad Azam

Oui, c'est le seul bon moyen pour tout ce qui est en dessous de 5,7 .. comment n'est-ce pas la réponse sélectionnée
user3548161

31

Depuis Laravel 5.7, vous pouvez passer un éventail d'options à Auth::routes(). Vous pouvez ensuite désactiver les routes de registre avec:

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

Vous pouvez voir comment cela fonctionne à partir du code source: src / Illuminate / Routing / Router.php .


1
À mon avis, c'est la bonne réponse. Bien trouvé!
Rick Kuilman

26

Méthode 1 pour la version 5.3

Dans laravel 5.3, vous n'avez pas AuthController. pour désactiver la route de registre, vous devez changer de constructeur RegisterControllercomme ceci:

Vous pouvez changer de formulaire:

public function __construct()
{

    $this->middleware('guest');

}

à:

use Illuminate\Support\Facades\Redirect;

public function __construct()
{

    Redirect::to('/')->send();

}

Remarque: pour l'utilisation, Redirect n'oubliez pas de user Redirect; Donc l'accès utilisateur à https: // nom_hôte / register est redirigé vers "/".

Méthode 2 pour la version 5.3

Lorsque nous utilisons, php artisan make:authil est ajouté Auth::route(); automatiquement. Veuillez remplacer la route dans /routes/web.php. Vous pouvez changer c'est comme ceci: * vous devez commenter cette ligne:Auth::routes();

    <?php

/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| This file is where you may define all of the routes that are handled
| by your application. Just tell Laravel the URIs it should respond
| to using a Closure or controller method. Build something great!
|
*/


// Auth::routes();
Route::get('/login', 'Auth\LoginController@showLoginForm' );
Route::post('/login', 'Auth\LoginController@login');
Route::post('/logout', 'Auth\LoginController@logout');

Route::get('/home', 'HomeController@index');

Merci! J'espère que cela pourra résoudre vos problèmes.


J'ajouterais des noms de route comme spécifié dans vendor / laravel / framework / src / Illuminate / Routing / Router.php Route :: get ('login', 'Auth \ LoginController @ showLoginForm') -> name ('login'); Route :: post ('login', 'Auth \ LoginController @ login'); Route :: post ('logout', 'Auth \ LoginController @ logout') -> nom ('déconnexion');
Luciano Fantuzzi

Rediriger la classe manquée sur la première méthode, mais passer à $this->middleware('auth');- fonctionne!
Gediminas

12

L'écrasement de getRegister et postRegister est délicat - si vous utilisez git, il y a une forte possibilité qui .gitignoreest configuré pour ignorer les fichiers du framework, ce qui conduira au résultat que l'enregistrement sera toujours possible dans votre environnement de production (si laravel est installé via composer par exemple )

Une autre possibilité consiste à utiliser routes.php et à ajouter cette ligne:

Route::any('/auth/register','HomeController@index');

De cette façon, les fichiers du framework sont laissés seuls et toute demande sera toujours redirigée hors du module de registre Frameworks.


4
Les classes qui remplacent les méthodes du framework ne sont pas dans le framework (elles seraient dans le dossier app) et seraient stockées par git. Le remplacement des méthodes ne signifie pas que vous les modifiez dans les fichiers de structure.
datashaman

11

Le AuthController.php@limonte a remplacé est dans App\Http\Controllers\Auth, pas dans le répertoire du fournisseur, donc Git n'ignore pas ce changement.

J'ai ajouté ces fonctions:

public function register() {
    return redirect('/');
}

public function showRegistrationForm() {
    return redirect('/');
}

et cela fonctionne correctement.


9

LAravel 5.6

Auth::routes([
    'register' => false, // Registration Routes...
    'reset' => false, // Password Reset Routes...
    'verify' => false, // Email Verification Routes...
]);

Cela devrait être fusionné dans la réponse acceptée, mais juste une correction mineure. Cette fonctionnalité a été introduite dans Laravel 5.7, pas dans Laravel 5.6
WebSpanner

8

Voici ma solution à partir de 5.4:

//Auth::routes();
// Authentication Routes...
Route::get('login', 'Auth\LoginController@showLoginForm')->name('login');
Route::post('login', 'Auth\LoginController@login');
Route::post('logout', 'Auth\LoginController@logout')->name('logout');

// Registration Routes...
//Route::get('register', 'Auth\RegisterController@showRegistrationForm')->name('register');
//Route::post('register', 'Auth\RegisterController@register');

// Password Reset Routes...
Route::get('password/reset', 'Auth\ForgotPasswordController@showLinkRequestForm')->name('password.request');
Route::post('password/email', 'Auth\ForgotPasswordController@sendResetLinkEmail')->name('password.email');
Route::get('password/reset/{token}', 'Auth\ResetPasswordController@showResetForm')->name('password.reset');
Route::post('password/reset', 'Auth\ResetPasswordController@reset');

Remarquez que j'ai commenté Auth::routes()et les deux itinéraires d'inscription.

Important: vous devez également vous assurer de supprimer toutes les instances de route('register')dans votre app.blademise en page, sinon Laravel générera une erreur.


^ ceci. Au cas où ces routes changeraient, copiez / collez-les simplement à partir du bundle de routes Auth situé à @ github.com/laravel/framework/blob/… et commentez les routes d'enregistrement.
pbond

7

La méthode suivante fonctionne très bien:

Copiez tous les itinéraires /vendor/laravel/framework/src/Illuminate/Routing/Router.phpet collez-les dans web.phpet commentez ou supprimez Auth::routes().

Ensuite, configurez une condition pour activer et désactiver l'enregistrement à partir de .env. Dupliquez le 503.blade.phpfichier views/errorset créez un 403 interdit ou ce que vous voulez.

Ajoutez ALLOW_USER_REGISTRATION=à .env et contrôlez l'inscription des utilisateurs en définissant sa valeur sur true ou false.

Vous avez maintenant un contrôle total des itinéraires et les fichiers des fournisseurs restent intacts.

web.php

//Auth::routes();

// Authentication Routes...
Route::get('login', 'Auth\LoginController@showLoginForm')->name('login');
Route::post('login', 'Auth\LoginController@login');
Route::post('logout', 'Auth\LoginController@logout')->name('logout');

// Registration Routes...
if (env('ALLOW_USER_REGISTRATION', true))
{
    Route::get('register', 'Auth\RegisterController@showRegistrationForm')->name('register');
    Route::post('register', 'Auth\RegisterController@register');
}
else
{
    Route::match(['get','post'], 'register', function () {
        return view('errors.403');
    })->name('register');
}

// Password Reset Routes...
Route::get('password/reset', 'Auth\ForgotPasswordController@showLinkRequestForm')->name('password.request');
Route::post('password/email', 'Auth\ForgotPasswordController@sendResetLinkEmail')->name('password.email');
Route::get('password/reset/{token}', 'Auth\ResetPasswordController@showResetForm')->name('password.reset');
Route::post('password/reset', 'Auth\ResetPasswordController@reset');

Ceci est une combinaison de quelques réponses précédentes notamment Rafal G. et Daniel Centore.


6

Sur laravel 5.6 et au-dessus, vous pouvez éditer dans le fichier web.php

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

Et tu peux le rendre vrai si tu changes d'avis, je vois les choses facilement de cette façon


5

Dans routes.php, ajoutez simplement ce qui suit:

if (!env('ALLOW_REGISTRATION', false)) {
    Route::any('/register', function() {
        abort(403);
    });
}

Ensuite, vous pouvez contrôler sélectivement si l'enregistrement est autorisé ou non dans votre .envfichier.


3

J'ai dû utiliser:

public function getRegister()
{
    return redirect('/');
}

L'utilisation de Redirect :: to () m'a donné une erreur:

Class 'App\Http\Controllers\Auth\Redirect' not found

Merci, oui c'est une nouvelle fonctionnalité de version, vous pouvez utiliser cette fonction ou utiliser la classe précédente, mais la classe précédente a besoin de \ avant, je veux dire \ Redirect :: to ('destination');
Milad Rahimi

3

Dans Laravel 5.4

Vous pouvez trouver toutes les routes enregistrées Auth::routes()dans la classe \Illuminate\Routing\Routerdans la méthodeauth()

cela ressemble à ceci:

/**
 * Register the typical authentication routes for an application.
 *
 * @return void
 */
public function auth()
{
    // 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...
    $this->get('register', 'Auth\RegisterController@showRegistrationForm')->name('register');
    $this->post('register', 'Auth\RegisterController@register');

    // Password Reset Routes...
    $this->get('password/reset', 'Auth\ForgotPasswordController@showLinkRequestForm')->name('password.request');
    $this->post('password/email', 'Auth\ForgotPasswordController@sendResetLinkEmail')->name('password.email');
    $this->get('password/reset/{token}', 'Auth\ResetPasswordController@showResetForm')->name('password.reset');
    $this->post('password/reset', 'Auth\ResetPasswordController@reset');
}

Copiez simplement les itinéraires que vous voulez / dont vous avez besoin et tout va bien!


2

Dans laravel 5.3, vous devez remplacer la valeur showRegistrationForm()par défaut en incluant le code ci-dessous dans le RegisterController.phpfichier dansapp\Http\Controllers\Auth

    /**
     * Show the application registration form.
     *
     * @return \Illuminate\Http\Response
     */
    public function showRegistrationForm()
    {
        //return view('auth.register');
         abort(404);  //this will throw a page not found exception
    }

puisque vous ne voulez pas autoriser l'enregistrement, il est préférable de simplement lancer 404 errorpour que l'intrus sache qu'il est perdu. Et lorsque vous êtes prêt pour l'enregistrement dans votre application, décommentez //return view('auth.register');puis commentezabort(404);

\\\\\\\\\\\\\\\\\\\ JUST UN FYI /////////////////////////// ////

Si vous devez utiliser plusieurs authentifications telles que créer une authentification pour les utilisateurs, les membres, les étudiants, les administrateurs, etc., je vous conseille de vérifier ce hesto / multi-auth, c'est un package génial pour des autorisations illimitées dans les applications L5.

Vous pouvez en savoir plus sur la méthodologie Auth et son fichier associé dans cet article.


2
Vous devez également patcher la route de publication afin d'éviter l'enregistrement de l'utilisateur via une demande de publication.
Vaishnav Mhetre

2

Dans Laravel 5.5

J'essayais d'accomplir le même problème dans Laravel 5.5. Au lieu d'utiliser Auth::routes()dans le fichier de routes web.php, je n'ai inclus que les routes de connexion / déconnexion:

Route::get('login', 'Auth\LoginController@showLoginForm')->name('login');
Route::post('login', 'Auth\LoginController@login');
Route::post('logout', 'Auth\LoginController@logout')->name('logout');

2

Cela a été mentionné dans les commentaires précédents, mais je voudrais préciser qu'il existe plusieurs façons d'accéder aux routes d'authentification dans votre fichier web.php dans Laravel ^ 5.7. selon votre version, cela peut sembler un peu différent mais ils obtiennent le même résultat.

Première option

Route::auth([
  'register' => false, // Registration Routes...
  'reset' => false, // Password Reset Routes...
  'verify' => false, // Email Verification Routes...
]);

Deuxième option

Auth::routes([
  'register' => false, // Registration Routes...
  'reset' => false, // Password Reset Routes...
  'verify' => false, // Email Verification Routes...
]);

1

Définissez Register route false dans votre web.php.

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

0

Afin de ne pas trop changer le code tel qu'il est, créez simplement un middleware pour détecter si l'url de la requête est url ('register'), puis redirigez vers 404 ou faites n'importe où.


1
Solution à très long terme. Un simple remplacement de fonction avec abandon peut certainement fonctionner.
Vaishnav Mhetre

0

Dans Laravel 5.5

Travailler sur un problème similaire et définir l'argument middleware d'invité à «auth» semblait être une solution plus élégante.

Modifier le fichier: app-> http-> Controller-> Auth-> RegisterController.php

public function __construct()
{
     //replace this
     //$this->middleware('guest');

     //with this argument.
       $this->middleware('auth');
}

Je peux me tromper cependant ... mais cela semble plus simple que de modifier le routage avec plus de lignes et moins de merde que de simplement rediriger la page ... du moins dans ce cas, vouloir verrouiller l'enregistrement pour les invités.


Je serais curieux de savoir si un utilisateur peut s'inscrire plusieurs fois en utilisant cette méthode. le guestmiddleware est responsable de la redirection d'un utilisateur déjà connecté à partir d'une page à laquelle seul un invité peut accéder (c'est-à-dire une /registerpage)
Kingsley

0

Je suppose que ce serait plutôt une meilleure solution.

Remplacez les méthodes suivantes comme indiqué ci-dessous dans

App \ Http \ Controller \ Auth \ RegisterController.php

use Illuminate\Http\Response;

.
.
.

public function showRegistrationForm()
{
    abort(Response::HTTP_NOT_FOUND);
}

public function register(Request $request)
{
    abort(Response::HTTP_NOT_FOUND);
}

0

Dans Laravel 5.5, c'est très simple, si vous utilisez le système d'itinéraire CRUD.

Allez à app/http/controllers/RegisterController il y a un espace de noms:Illuminate\Foundation\Auth\RegistersUser

Vous devez vous rendre dans RegistersUser: Illuminate\Foundation\Auth\RegistersUser

Il y a le showRegistrationFormchangement d' appel de méthode ceci: return view('auth.login');pour ceci: return redirect()->route('auth.login');et retirer de votre registre d'appel d'itinéraire de page de lame. Cela peut ressembler à ça:

 <li role="presentation">
     <a class="nav-link" href="{{ route('register') }}">Register</a>
 </li> 

0

J'ai trouvé que c'était la solution la plus simple dans laravel 5.6! Il redirige toute personne qui tente d'accéder à yoursite.com/register vers yoursite.com

routes / web.php

// redirect from register page to home page
Route::get('/register', function () {
    return redirect('/');
});

0

Tout ce que j'ai fait a été de remplacer le code de lame de registre par le code de lame de connexion. De cette façon, le registre va toujours à la connexion.

resources/views/auth/register.blade.php est remplacé par resources/views/auth/login.blade.php


0

Pour Laravel 5.6+, collez les méthodes ci-dessous dans app\Http\Controller\Auth\RegisterController

/*
* Disabling registeration.
*
*/
public function register() 
{
    return redirect('/');
}

/*
* Disabling registeration.
*
*/
public function showRegistrationForm() 
{
    return redirect('/');
}

Maintenant RegistersUser, vous remplacez ces méthodes dans le trait, chaque fois que vous changez d'avis, supprimez ces méthodes. Vous pouvez également commenter les liens de registre welcome.blade.phpet les login.blade.phpvues.


En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.