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?


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()
{

}

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.


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.


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


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


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.


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.


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


9

LAravel 5.6

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

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.


^ 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.


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


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.


3

Tuve que usar:

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

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

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

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!


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.


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

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...
]);


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.


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.


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

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> 

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

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


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.


-11

añadir

use \Redirect;

en la parte superior del archivo


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.