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?

Milad Rahimi
la source
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()
{

}
Limon Monte
la source
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.

Rafał G.
la source
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.

theeternalsw0rd
la source
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

Yassin
la source
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 .

Christopher Geary
la source
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.

Phanith Kung
la source
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.

JCoolinger
la source
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.

Jesús Amieiro
la source
9

LAravel 5.6

Auth::routes([
    'register' => false, // Registration Routes...
    'reset' => false, // Password Reset Routes...
    'verify' => false, // Email Verification Routes...
]);
Isaac Limón
la source
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.

kjdion84
la source
^ 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.

Jeffrey
la source
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

Sajjad Aljileezi
la source
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.

Daniel Centore
la source
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
ghodder
la source
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!

bambouole
la source
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.

Le mec mort
la source
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');
David Angel
la source
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...
]);
Edvard Åkerberg
la source
1

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

Auth::routes(['register' => false]);
Connectify_user
la source
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ù.

Motolola
la source
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.

Chad Quilter
la source
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);
}
Vaishnav Mhetre
la source
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> 
macalu
la source
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('/');
});
Ryan Dhungel
la source
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

Akula
la source
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.

Yamen Ashraf
la source
-11

ajouter

use \Redirect;

en haut du fichier

sjas
la source
Vous voulez dire use \ Redirect;
Mike Miller
Ce n'est pas une réponse complète.
Martin Bean
en haut de quel fichier? la solution est incomplète et déroutante.
The Dead Guy