Cómo deshabilitar el registro de nuevos usuarios en Laravel

130

Estoy usando Laravel (v5).

Necesito un usuario y ya lo he registrado. Ahora quiero deshabilitar el registro para nuevos usuarios. Por supuesto, necesito el formulario de inicio de sesión para trabajar.

¿Cómo puedo hacer eso?

Milad Rahimi
fuente
Simplemente elimine los métodos relacionados con el registro de su archivo routes.php . No anule los métodos con métodos en blanco: es un enfoque horrible y hack-y ya que luego debe volver a agregar los cuerpos si decide volver a habilitar esa función en el futuro.
Martin Bean
1
@MartinBean no hay rutas en routes.php. Para habilitar las funciones de autenticación, todo lo que debe hacer es agregar Route::auth();al archivo.
miken32
@ miken32 Mi comentario fue de hace más de cinco meses, antes de que se promoviera el Route::auth()acceso directo.
Martin Bean
55
si está en laravel 5.5 y superior Auth::routes(['register' => false]);en web.php
Manojkiran. A

Respuestas:

234

Laravel 5.7 introdujo la siguiente funcionalidad:

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

Las opciones actualmente posibles aquí son:

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

Para versiones anteriores de Laravel, simplemente anule showRegistrationForm()y register()métodos en

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

public function register()
{

}
Limon Monte
fuente
55
Sería conveniente cambiar también la función create () para: lanzar una nueva Excepción ('No es posible el registro');
el JinX
2
o se puede añadir abort(404)enfunction register()
William Notowidagdo
3
No recomendaría este enfoque, ya que sobrecargar el código para eliminar una característica nunca es algo bueno. Simplemente no registre las rutas relacionadas con el registro.
Martin Bean
44
Para Laravel 5.5, pon esto enAuth/RegisterController.php
kapoko
77
En Laravel 5.7 la showRegistrationForm()función está en la vendorcarpeta, técnicamente no se recomienda editar archivos en la carpeta del proveedor. Básicamente, lo que recomiendo es eliminar la ruta de registro web.php. Simplemente puede decir Auth::routes(['register' => false])en el web.phparchivo. ¡Salud!
Ahamed Rasheed
55

Si está utilizando Laravel 5.2 e instaló la funcionalidad relacionada con la autenticación, php artisan make:authentonces su app/Http/routes.phparchivo incluirá todas las rutas relacionadas con la autenticación simplemente llamando Route::auth().

El método auth () se puede encontrar en vendor/laravel/framework/src/Illuminate/Routing/Router.php. Entonces, si desea hacer lo que algunas personas sugieren aquí y deshabilitar el registro eliminando rutas no deseadas (probablemente una buena idea), entonces debe copiar las rutas que aún desea del método auth () y ponerlas en app/Http/routes.php(reemplazar la llamada a Ruta :: auth ()). Entonces, por ejemplo:

<?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 está utilizando una versión inferior a 5.2, entonces probablemente sea diferente, recuerdo que las cosas cambiaron bastante desde 5.0, en algún momento artisan make:authincluso se eliminó IIRC.

Rafał G.
fuente
En lugar de eliminar las rutas de registro, ¿es posible habilitarlas solo para un tipo particular de usuarios?
Sefran2
@ Sefran2 Puede lograr esto asociando grupos con middleware. Visite laravel.com/docs/5.2/routing#route-groups
Rafał G.
En primer lugar, he intentado Route::group(['middleware' => 'auth'], function () { Route::get('register', 'Auth\AuthController@showRegistrationForm'); Route::post('register', 'Auth\AuthController@register'); });, pero cuando el usuario ha iniciado sesión solicita /registerque se redirige a/
Sefran2
1
@ Sefran2 Eso se debe a que AuthController llama (a través de otras clases y rasgos, es un poco complicado) el middleware App\Http\Middleware\RedirectIfAuthenticated. Y ese middleware lo redirige a /si ya inició sesión. Lo que tiene sentido, ¿por qué querría registrarse si está conectado? :-) Si desea permitir sólo algunas rutas a algunos tipos de usuarios, que necesita para crear su propio middleware en lugar de['middleware' => 'auth']
Rafał G.
2
Para 5.3 son diferentes una vez más, pero aún se pueden encontrar en vendor / laravel / framework / src / Illuminate / Routing / Router.php
Matthieu
51

Esto puede ser nuevo en 5.7, pero ahora hay una matriz de opciones para el método de autenticación. Simplemente cambiando

Auth::routes();

a

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

en su archivo de rutas después de la ejecución php artisan make:authdeshabilitará el registro del usuario.

theeternalsw0rd
fuente
1
Gracias por esto, no sé desde qué versión existe, ¡pero creo que es el camino correcto para desactivar la parte de registro!
Olivier Rochaix
Fue agregado en 5.7.
Džuris
34

Para Laravel 5.3 y 5.4, esta es la forma correcta de hacerlo:

Tienes que cambiar:

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

a

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

en la aplicación / Http / Controller / Auth / RegisterController.php

Yassin
fuente
1
¡buen trabajo! Creo que de esta manera también protege de la solicitud POST para crear usuarios a través de la publicación.
Gediminas
3
esto permitirá a los usuarios registrados ver la página de registro que no desearían
ahmed
2
Use middleware ("auth") y luego middleware ("guest") para omitir la página de registro para todos
usuario3425867
1
entonces un usuario de autenticación puede registrar un nuevo usuario en este caso.
Muhammad Azam
Si esta es la única forma adecuada para cualquier cosa por debajo de 5,7 .. ¿cómo es que no esta la respuesta seleccionada
user3548161
31

A partir de Laravel 5.7, puede pasar una variedad de opciones a Auth::routes(). Luego puede deshabilitar las rutas de registro con:

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

Puede ver cómo funciona esto desde el código fuente: src / Illuminate / Routing / Router.php .

Christopher Geary
fuente
1
En mi opinión, esta es la respuesta correcta. Bonito encontrado!
Rick Kuilman
26

Método 1 para la versión 5.3

En laravel 5.3 no tengo AuthController. para deshabilitar la ruta de registro debe cambiar en el constructor deRegisterController esta manera:

Puedes cambiar de forma:

public function __construct()
{

    $this->middleware('guest');

}

a:

use Illuminate\Support\Facades\Redirect;

public function __construct()
{

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

}

Nota: para su uso Redirect , no se olvide de que user Redirect; el acceso del usuario a https: // host_name / register se redirige a "/".

Método 2 para la versión 5.3

Cuando lo usamos php artisan make:authse agrega Auth::route(); automáticamente. Anule la ruta en /routes/web.php. Puedes cambiarlo así: * necesitas comentar esta línea: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');

¡Gracias! Espero que pueda resolver tus problemas.

Phanith Kung
fuente
Agregaría nombres de ruta como se especifica en vendor / laravel / framework / src / Illuminate / Routing / Router.php Route :: get ('login', 'Auth \ LoginController @ showLoginForm') -> name ('login'); Ruta :: post ('login', 'Auth \ LoginController @ login'); Ruta :: post ('cerrar sesión', 'Auth \ LoginController @ logout') -> nombre ('cerrar sesión');
Luciano Fantuzzi
La clase de redireccionamiento se perdió en el primer método, pero cambiar a $this->middleware('auth');- ¡funciona!
Gediminas
12

Sobrescribir getRegister y postRegister es complicado: si está utilizando git, existe una alta posibilidad de que .gitignore de ignorar los archivos de marco, lo que dará como resultado que el registro aún será posible en su entorno de producción (si laravel se instala a través del compositor, por ejemplo )

Otra posibilidad es usar routes.php y agregar esta línea:

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

De esta manera, los archivos de marco se dejan solos y toda solicitud se redirigirá fuera del módulo de registro de Frameworks.

JCoolinger
fuente
44
Las clases que anulan los métodos del marco no están en el marco (estarían en la carpeta de la aplicación) y serían almacenadas por git. Anular métodos no significa que los cambie en los archivos de marco.
datashaman
11

El AuthController.php@limonte reemplazado está en App\Http\Controllers\Auth, no en el directorio de proveedores, por lo que Git no ignora este cambio.

He agregado estas funciones:

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

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

y funciona correctamente

Jesús Amieiro
fuente
9

LAravel 5.6

Auth::routes([
    'register' => false, // Registration Routes...
    'reset' => false, // Password Reset Routes...
    'verify' => false, // Email Verification Routes...
]);
Isaac Limón
fuente
Esto debería combinarse en la respuesta aceptada, pero solo una pequeña corrección. Esta característica se introdujo en Laravel 5.7, no en Laravel 5.6
WebSpanner el
8

Aquí está mi solución a 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');

Tenga en cuenta que he comentado Auth::routes()y las dos rutas de registro.

Importante: también debe asegurarse de eliminar todas las instancias de route('register')su app.bladediseño, o Laravel arrojará un error.

kjdion84
fuente
^ esto. En caso de que estas rutas cambien, simplemente cópielas / péguelas del paquete de rutas Auth ubicado en @ github.com/laravel/framework/blob/… y comente las rutas de registro.
pbond
7

El siguiente método funciona muy bien:

Copie todas las rutas /vendor/laravel/framework/src/Illuminate/Routing/Router.phpy péguelo web.phpy comente o elimine Auth::routes().

Luego configure un condicional para habilitar y deshabilitar el registro desde .env. Duplica el 503.blade.phparchivo views/errorsy crea un 403 prohibido o lo que quieras.

Agregue ALLOW_USER_REGISTRATION=a .env y controle el registro de usuarios estableciendo su valor en verdadero o falso.

Ahora tiene el control total de las rutas y los archivos del proveedor permanecen intactos.

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

Esta es una combinación de algunas respuestas anteriores, especialmente Rafal G. y Daniel Centore.

Jeffrey
fuente
6

En laravel 5.6 y superior puedes editar en el archivo web.php

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

y puedes hacerlo realidad si cambias de opinión, así lo veo fácil

Sajjad Aljileezi
fuente
5

En routes.php, solo agregue lo siguiente:

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

Luego puede controlar selectivamente si el registro está permitido o no en su .envarchivo.

Daniel Centore
fuente
3

Tuve que usar:

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

Usar Redirect :: to () me dio un error:

Class 'App\Http\Controllers\Auth\Redirect' not found
ghodder
fuente
Gracias, sí, esta es una nueva función de versión, puede usar esta función o usar la clase anterior, pero la clase anterior necesita \ antes, quiero decir \ Redirect :: to ('destination');
Milad Rahimi
3

En Laravel 5.4

Puede encontrar todas las rutas registradas Auth::routes()en la clase \Illuminate\Routing\Routeren el métodoauth()

se parece a esto:

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

¡Simplemente copie las rutas que desee / necesite y estará bien!

bambamboole
fuente
2

En laravel 5.3, debe anular el valor predeterminado showRegistrationForm()al incluir el siguiente código en el RegisterController.phparchivo enapp\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
    }

Dado que no desea permitir el registro, es mejor simplemente tirar 404 errorpara que el intruso sepa que está perdido. Y cuando esté listo para registrarse en su aplicación, descomente y //return view('auth.register');luego comenteabort(404);

\\\\\\\\\\\\\\\\\\\\\ SOLO UN FYI /////////////////////////// ////

Si necesita usar autenticación múltiple como crear autenticación para usuarios, miembros, estudiantes, administradores, etc., le aconsejo que revise este hesto / multi-auth, es un paquete increíble para autenticación ilimitada en aplicaciones L5.

Puede leer más sobre la metodología de autenticación y su archivo asociado en este artículo.

El hombre muerto
fuente
2
También debe parchear la ruta de publicación para evitar el registro del usuario a través de la solicitud de publicación.
Vaishnav Mhetre
2

En Laravel 5.5

Estaba tratando de lograr el mismo problema en Laravel 5.5. En lugar de usar Auth::routes()en el archivo de rutas web.php, solo incluí las rutas de inicio / cierre de sesión:

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

Esto se ha mencionado en comentarios anteriores, pero me gustaría aclarar que hay varias formas de acceder a las rutas de autenticación en su archivo web.php en Laravel ^ 5.7. dependiendo de su versión, puede parecer un poco diferente, pero logran el mismo resultado.

Primera opción

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

Segunda opción

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

Establezca Register route false en su web.php.

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

Para no cambiar demasiado el código tal como está, simplemente cree un middleware para detectar si la url de solicitud es url ('registro'), luego redirija a 404 o haga lo que sea.

Motolola
fuente
1
Solución a muy largo plazo. Una anulación de función simple con abortar definitivamente puede funcionar.
Vaishnav Mhetre
0

En Laravel 5.5

Trabajar en un problema similar y configurar el argumento de middleware de invitado a 'auth' parecía una solución más elegante.

Editar archivo: app-> http-> Controllers-> Auth-> RegisterController.php

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

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

Sin embargo, podría estar equivocado ... pero parece más hábil que editar la ruta con más líneas y menos timidez que simplemente redirigir la página ... al menos en este caso, querer bloquear el registro para los invitados.

Chad Quilter
fuente
Me gustaría saber si un usuario puede registrarse varias veces con este método. el guestmiddleware es responsable de redirigir a un usuario que ya inició sesión desde una página a la que solo un invitado puede acceder (es decir, una /registerpágina)
Kingsley
0

Supongo que esta sería una mejor solución.

Anule los siguientes métodos como se menciona a continuación en

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
fuente
0

En Laravel 5.5 es muy simple, si está utilizando el sistema de ruta CRUD.

Ir a app/http/controllers/RegisterController hay espacio de nombres:Illuminate\Foundation\Auth\RegistersUser

Debe ir al RegistersUser: Illuminate\Foundation\Auth\RegistersUser

Hay una llamada al método, showRegistrationFormcambie esto: return view('auth.login');para esto: return redirect()->route('auth.login');y elimine de su página Blade el registro de llamadas de ruta. Puede verse así:

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

¡Encontré que esta es la solución más fácil en laravel 5.6! Redirige a cualquiera que intente ir a yoursite.com/register a yoursite.com

rutas / web.php

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

Todo lo que hice fue reemplazar el código de la hoja de registro con el código de la hoja de inicio de sesión. De esa manera, registrarse todavía va a iniciar sesión.

resources/views/auth/register.blade.php se reemplaza con resources/views/auth/login.blade.php

Akula
fuente
0

Para Laravel 5.6+, pegue los siguientes métodos en app\Http\Controller\Auth\RegisterController

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

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

Ahora está anulando esos métodos en función RegistersUser, cada vez que cambie de opinión, elimine estos métodos. También puede comentar los enlaces de registro welcome.blade.phpy las login.blade.phpvistas.

Yamen Ashraf
fuente
-11

añadir

use \Redirect;

en la parte superior del archivo

sjas
fuente
Te refieres a use \ Redirect;
Mike Miller
Esta no es una respuesta completa.
Martin Bean
en la parte superior de qué archivo? La solución es incompleta y confusa.
The Dead Guy