Come disabilitare la registrazione di nuovi utenti in Laravel


130

Sto usando Laravel (v5).

Ho bisogno di un utente e l'ho già registrato. Ora voglio disabilitare la registrazione per i nuovi utenti. Certo, ho bisogno del modulo di login per funzionare.

Come lo posso fare?


Basta rimuovere i metodi relativi al registro dal file route.php . Non sovrascrivere i metodi con quelli vuoti: è un approccio orribile e hack-y poiché dovrai aggiungere nuovamente i corpi se decidi di riattivare quella funzionalità in futuro.
Martin Bean,

1
@MartinBean non ci sono percorsi in routes.php. Per abilitare le funzioni di autenticazione, tutto ciò che devi fare è aggiungere Route::auth();al file.
miken32,

@ miken32 Il mio commento è stato di oltre cinque mesi fa, prima che la Route::auth()scorciatoia fosse sostenuta.
Martin Bean,

5
se sei in laravel 5.5 e versioni successive Auth::routes(['register' => false]);in web.php
Manojkiran.A

Risposte:


234

Laravel 5.7 ha introdotto la seguente funzionalità:

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

Le opzioni attualmente possibili qui sono:

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

Per le versioni precedenti di Laravel basta eseguire l'override showRegistrationForm()e i register()metodi

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

public function register()
{

}

5
Potrebbe essere saggio modificare anche la funzione create () in: genera una nuova eccezione ("Registrazione impossibile");
il JinX

2
oppure è possibile aggiungere abort(404)sufunction register()
William Notowidagdo

3
Non consiglierei questo approccio, poiché sovraccaricare il codice per rimuovere una funzione non è mai una buona cosa. Basta non registrare i percorsi relativi alla registrazione.
Martin Bean,

4
Per Laravel 5.5, inseriscilo inAuth/RegisterController.php
kapoko il

7
Nella showRegistrationForm()funzione Laravel 5.7 è nella vendorcartella, tecnicamente non è consigliabile modificare i file nella cartella del fornitore. Fondamentalmente ciò che consiglio è di rimuovere il percorso di registrazione da web.php. Puoi semplicemente dire Auth::routes(['register' => false])nel web.phpfile. Saluti!
Ahamed Rasheed

55

Se stai utilizzando Laravel 5.2 e hai installato la funzionalità relativa all'autorizzazione, il php artisan make:authtuo app/Http/routes.phpfile includerà tutti i percorsi relativi all'autorizzazione semplicemente chiamando Route::auth().

Il metodo auth () può essere trovato in vendor/laravel/framework/src/Illuminate/Routing/Router.php. Quindi, se vuoi fare come suggeriscono alcune persone qui e disabilitare la registrazione rimuovendo le route indesiderate (probabilmente una buona idea), allora devi copiare le route che desideri ancora dal metodo auth () e inserirle app/Http/routes.php(sostituendo la chiamata a Route :: auth ()). Quindi per esempio:

<?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');

Se stai usando una versione precedente alla 5.2, probabilmente è diverso, ricordo che le cose sono cambiate un po 'da 5.0, a un certo punto è artisan make:authstato persino rimosso IIRC.


Invece di rimuovere i percorsi di registrazione, è possibile abilitarli solo per un particolare tipo di utenti?
Sefran2,

@ Sefran2 È possibile ottenere questo risultato associando i gruppi al middleware. Dai
Rafał G.

Prima di tutto, ci ho provato Route::group(['middleware' => 'auth'], function () { Route::get('register', 'Auth\AuthController@showRegistrationForm'); Route::post('register', 'Auth\AuthController@register'); });, ma quando l'utente registrato richiede di /registeressere reindirizzato a/
Sefran2

1
@ Sefran2 Questo perché AuthController chiama (tramite altre classi e tratti, è un po 'contorto) il middleware App\Http\Middleware\RedirectIfAuthenticated. E quel middleware ti reindirizza a /se hai già effettuato l'accesso. Il che ha senso, perché dovresti registrarti se hai effettuato l'accesso? :-) Se vuoi consentire solo alcune rotte verso alcuni tipi di utenti, dovrai creare il tuo middleware invece di['middleware' => 'auth']
Rafał G.

2
Per 5.3 sono diversi ancora una volta, ma possono ancora essere trovati in vendor / laravel / framework / src / Illuminate / Routing / Router.php
Matthieu

51

Questo potrebbe essere nuovo in 5.7, ma ora esiste un array di opzioni per il metodo auth. Semplicemente cambiando

Auth::routes();

per

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

nel file dei percorsi dopo l'esecuzione php artisan make:authdisabiliterà la registrazione dell'utente.


1
Grazie per questo, non so da quale versione esiste, ma penso che sia la strada giusta per disabilitare la parte di registrazione!
Olivier Rochaix,

È stato aggiunto in 5.7.
Džuris,

34

Per Laravel 5.3 e 5.4, ecco il modo corretto di farlo:

Devi cambiare:

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

per

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

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


1
bel lavoro! Penso che in questo modo protegga anche dalla richiesta POST per la creazione di utenti via posta?
Gediminas,

3
questo consentirà agli utenti registrati di vedere la pagina di registrazione che non vorresti
ahmed

2
Usa middleware ("auth") quindi middleware ("guest") per ignorare la pagina di registrazione per tutti
user3425867

1
quindi un utente di autenticazione può registrare un nuovo utente in questo caso.
Muhammad Azam,

Sì, questo è l'unico modo corretto per qualsiasi cosa al di sotto di 5.7 .. in che modo questa non è la risposta selezionata
user3548161


26

Metodo 1 per la versione 5.3

In laravel 5.3 non hai AuthController. per disabilitare la route del registro dovresti cambiare in RegisterControllerquesto modo:

Puoi cambiare forma:

public function __construct()
{

    $this->middleware('guest');

}

per:

use Illuminate\Support\Facades\Redirect;

public function __construct()
{

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

}

Nota: per l'uso Redirect non dimenticare di user Redirect; Quindi l'accesso dell'utente a https: // nome_host / register è il reindirizzamento a "/".

Metodo 2 per la versione 5.3

Quando lo utilizziamo php artisan make:authviene aggiunto Auth::route(); automaticamente. Si prega di ignorare il percorso in /routes/web.php. Puoi cambiare in questo modo: * devi commentare questa riga: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');

Grazie! Spero che possa risolvere i tuoi problemi.


Vorrei aggiungere i nomi delle rotte come specificato in 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') -> nome ('logout');
Luciano Fantuzzi,

Classe di reindirizzamento mancata sul primo metodo, ma cambiando in $this->middleware('auth');- funziona!
Gediminas,

12

Sovrascrivere getRegister e postRegister è complicato - se stai usando git c'è un'alta possibilità che .gitignore è impostata per ignorare i file di framework che porterà al risultato che la registrazione sarà ancora possibile nel tuo ambiente di produzione (se laravel è installato tramite compositore per esempio )

Un'altra possibilità è usare route.php e aggiungere questa riga:

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

In questo modo i file del framework vengono lasciati soli e qualsiasi richiesta verrà comunque reindirizzata dal modulo di registro di Frameworks.


4
Le classi che sovrascrivono i metodi del framework non sono nel framework (sarebbero nella cartella dell'app) e sarebbero archiviate da git. Sostituire i metodi non significa cambiarli nei file del framework.
datashaman

11

Il AuthController.php@limonte ha ignorato è in App\Http\Controllers\Auth, non nella directory vendor, in modo da Git non ignora questo cambiamento.

Ho aggiunto queste funzioni:

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

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

e funziona correttamente.


9

LAravel 5.6

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

Questo dovrebbe essere unito alla risposta accettata, ma solo una correzione minore. Questa funzione è stata introdotta in Laravel 5.7, non in Laravel 5.6
WebSpanner il

8

Ecco la mia soluzione a partire da 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');

Nota che ho commentato Auth::routes()e le due rotte di registrazione.

Importante: devi anche assicurarti di rimuovere tutte le istanze del route('register')tuo app.bladelayout, altrimenti Laravel genererà un errore.


^ questo. Nel caso in cui queste rotte dovessero cambiare, è sufficiente copiarle / incollarle dal pacchetto delle rotte Auth situato su @ github.com/laravel/framework/blob/… e commentare le rotte di registrazione.
sabato

7

Il seguente metodo funziona alla grande:

Copia tutte le rotte da /vendor/laravel/framework/src/Illuminate/Routing/Router.phpe incollale in, web.phpcommenta o elimina Auth::routes().

Quindi impostare un condizionale per abilitare e disabilitare la registrazione da .env. Duplica il 503.blade.phpfile views/errorse crea un 403 proibito o qualunque cosa ti piaccia.

Aggiungi ALLOW_USER_REGISTRATION=a .env e controlla la registrazione dell'utente impostando il suo valore su vero o falso.

Ora hai il pieno controllo delle rotte e i file del fornitore rimangono intatti.

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');

Questa è una combinazione di alcune risposte precedenti, in particolare Rafal G. e Daniel Centore.


6

Su laravel 5.6 e versioni successive puoi modificare il file web.php

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

e puoi renderlo vero se cambi idea, lo vedo facile in questo modo


5

In routes.php, basta aggiungere quanto segue:

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

Quindi puoi controllare in modo selettivo se la registrazione è consentita o meno nel tuo .envfile.


3

Ho dovuto usare:

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

L'uso di Redirect :: to () mi ha dato un errore:

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

Grazie, sì, questa è la nuova funzionalità della versione, è possibile utilizzare questa funzione o utilizzare la classe precedente, ma la classe precedente ha bisogno \ prima di essa, intendo \ Redirect :: to ('destination');
Milad Rahimi,

3

In Laravel 5.4

Puoi trovare tutti i percorsi che sono registrati Auth::routes()nella classe \Illuminate\Routing\Routernel metodoauth()

sembra così:

/**
 * 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');
}

Basta copiare i percorsi che desideri / hai bisogno e stai bene!


2

In laravel 5.3, dovresti sovrascrivere il valore predefinito showRegistrationForm()includendo il codice qui sotto nel RegisterController.phpfileapp\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
    }

dal momento che non si desidera consentire la registrazione, è meglio lanciare in 404 errormodo che l'intruso sappia che si è perso. E quando sei pronto per la registrazione nella tua app, decommenta //return view('auth.register');e commentaabort(404);

\\\\\\\\\\\\\\\\\\\\ JUST AN FYI /////////////////////////// ////

Se hai bisogno di usare un'autenticazione multipla come creare auth per utenti, membri, studenti, admin, ecc. Allora ti consiglio di dare un'occhiata a questo hesto / multi-auth è un fantastico pacchetto per aut illimitate nelle app L5.

Puoi leggere ulteriori informazioni sulla metodologia Auth e sul file associato in questo articolo.


2
È inoltre necessario patchare il percorso postale in modo da evitare la registrazione dell'utente attraverso la richiesta di posta.
Vaishnav Mhetre,

2

In Laravel 5.5

Stavo cercando di realizzare lo stesso problema in Laravel 5.5. Invece di utilizzare Auth::routes()nel file delle rotte web.php, ho incluso solo le rotte di login / logout:

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

2

Questo è stato menzionato nei commenti precedenti, ma vorrei chiarire che ci sono diversi modi per accedere alle rotte auth nel tuo file web.php in Laravel ^ 5.7. a seconda della versione potrebbe sembrare un po 'diverso ma ottengono lo stesso risultato.

Prima opzione

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

Seconda opzione

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

1

Imposta Registra percorso falso nel tuo web.php.

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

0

Per non modificare troppo il codice così com'è, basta creare un middleware per rilevare se l'URL della richiesta è url ('register'), quindi reindirizzare a 404 o fare ovunque.


1
Soluzione a lungo termine. Una semplice funzione di sostituzione con interruzione può sicuramente funzionare.
Vaishnav Mhetre,

0

In Laravel 5.5

Lavorare su un problema simile e impostare l'argomento del middleware da guest a "auth" sembrava una soluzione più elegante.

Modifica file: app-> http-> Controller-> Auth-> RegisterController.php

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

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

Potrei sbagliarmi però ... ma sembra più fluido della modifica del routing con più linee e meno shity rispetto al semplice reindirizzamento della pagina ... almeno in questo caso, volendo bloccare la registrazione per gli ospiti.


Sarei curioso di sapere se un utente può registrarsi più volte usando questo metodo. il guestmiddleware è responsabile del reindirizzamento di un utente già registrato lontano da una pagina a cui solo un ospite può accedere (ovvero una /registerpagina)
Kingsley

0

Immagino che questa sarebbe piuttosto una soluzione migliore.

Sostituisci i seguenti metodi come indicato di seguito

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

In Laravel 5.5 è molto semplice, se si utilizza il sistema di route CRUD.

Vai a app/http/controllers/RegisterController c'è spazio dei nomi:Illuminate\Foundation\Auth\RegistersUser

Devi andare su RegistersUser: Illuminate\Foundation\Auth\RegistersUser

C'è la chiamata del metodo showRegistrationFormcambia questo: return view('auth.login');per questo: return redirect()->route('auth.login');e rimuovi dal tuo registro delle chiamate la route della pagina blade. Potrebbe apparire così:

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

0

Ho trovato che questa è la soluzione più semplice in laravel 5.6! Reindirizza chiunque tenti di accedere a yoursite.com/register a yoursite.com

percorsi / web.php

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

0

Tutto quello che ho fatto è stato sostituire il codice del blade del registro con il codice del blade di accesso. In questo modo il registro continua ad accedere.

resources/views/auth/register.blade.php è sostituito da resources/views/auth/login.blade.php


0

Per Laravel 5.6+, incolla i seguenti metodi app\Http\Controller\Auth\RegisterController

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

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

Ora sovrascrivi quei metodi nel RegistersUsertratto, ogni volta che cambi idea rimuovi questi metodi. È inoltre possibile commentare i collegamenti welcome.blade.phpe le login.blade.phpvisualizzazioni del registro .


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.