Curso Autenticacion

En esta lección del curso de Métodos de Autenticación con Laravel aprenderás cómo desactivar o personalizar la URL de registro de tu aplicación.

Repositorio

Ver el código de esta lección en GitHub

Notas

Por Pastor Ramos

Determinando los cambios del comando artisan make:auth

Vamos a examinar los cambios producidos por el comando make:auth desde un nuevo proyecto creado con el instalador de Laravel. Para ello primero crearemos el proyecto authdemo con la siguiente instrucción:

projects$ laravel new authdemo

Luego, navegaremos hasta el directorio principal del proyecto y lo inicializaremos para llevar el control y seguimiento con git.

projects/authdemo$ git init

En este punto, podemos ver todos los archivos que fueron copiados con el instalador, con el siguiente comando:

projects/authdemo$ git status

Vamos a agregarlos al Stage de git para hacer nuestro primer commit habitual.

projects/authdemo$ git add .
projects/authdemo$ git commit -m "first commit"

Ahora, el estado del proyecto está completamente limpio y podemos verificarlo fácilmente con la siguiente instrucción:

projects/authdemo$ git status

Vamos a inspeccionar los cambios que involucra la ejecución del comando artisan make:auth.

projects/authdemo$ php artisan make:auth

Seguido de la inspección del estado de git nuevamente para ver los cambios más recientes del proyecto:

$projects/authdemo $ git status

Podemos ver de forma separada los archivos modificados y los que fueron agregados al proyecto, pero concretamente observaremos los cambios al archivo de rutasroutes/web.php, con el comando git diff.

$projects/authdemo$ git diff routes/web.php
diff --git a/routes/web.php b/routes/web.php
index 810aa34..12fc04c 100644
--- a/routes/web.php
+++ b/routes/web.php
@@ -14,3 +14,7 @@
 Route::get('/', function () {
     return view('welcome');
 });
+
+Auth::routes();
+
+Route::get('/home', 'HomeController@index')->name('home');

Las instrucciones precedidas por el símbolo +, señalan las modificaciones realizadas: Se agregó la llamada a la clase Auth::routes() y una nueva ruta para/home.

Examinando las clases

De regreso a nuestro proyecto styde-auth, si abrimos el archivo de rutas web.php veremos el llamado que fue agregado, es decir Auth::routes().  A su vez dentro del facadeAuthcuya ruta es ~/projects/styde-auth/vendor/laravel/framework/src/Illuminate/Support/Facades/Auth.php también podemos visualizar el contenido del método routes(), esto es:

public static function routes(array $options = [])
{
    static::$app->make('router')->auth($options);
}

Aquí observaremos que este métodoroutes()delega al métodoauth()del objetorouter que es cargado con el contenedor de inyección de dependencias de Laravel.

Para visualizar el contenido de este objeto router, debemos  dirigirnos a la clase Router cuya ruta es: ~/projects/styde-auth/vendor/laravel/framework/src/Illuminate/Routing/Router.php.. Una vez aquí, podemos revisar la declaración del método auth() junto con todas las rutas que se definen allí:

public function auth(array $options = [])
{
    // 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...
    if ($options['register'] ?? true) {
        $this->get('register', 'Auth\RegisterController@showRegistrationForm')->name('register');
        $this->post('register', 'Auth\RegisterController@register');
    }

    // Password Reset Routes...
    if ($options['reset'] ?? true) {
        $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')->name('password.update');
     }

    // Email Verification Routes...
    if ($options['verify'] ?? false) {
        $this->emailVerification();
    }
}

¿Cómo desactivar el módulo de registro?

Este código contiene las rutas URL que permiten invocar los módulos de registro, autenticación y recuperación de contraseñas. Además, podemos observar que algunos módulos se pueden usar opcionalmente.

Por ejemplo: si quisiéramos ocultar el módulo de registro, podemos ver que tenemos acá una opción para desactivarlo. Simplemente debemos pasar un array asociativo con la llave ‘register’ igual a falso, directamente en el archivo routes/web.phpque hace el llamado inicial.

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

Si ejecutamos el proyecto desde el navegador, podemos verificar que la opción de registro ya no aparece. De igual forma, el sistema se protege también rechazando cualquier esfuerzo que hagamos para acceder directamente a la URL www.styde-auth/register desde el navegador.

Podemos verificar esto también utilizando el comando:

projects/styde-auth$ php artisan route:list

Nota que todas las rutas de la sección // Registration routes ... del método auth() han desaparecido.

Personalizando las URLs del módulo de registro en Laravel

Si nosotros quisiéramos personalizar aún más las rutas al módulo de registro, por ejemplo llamarla en español www.styde-auth/registro en lugar de www.styde-auth/register, podemos hacerlo en el código directamente. Pero no es una buena práctica hacerlo desde la clase Router del Framework puesto que perderíamos estos cambios cada vez que ejecutemos el comando composer update.

Modificando el archivo routes/web.php

La idea es copiar las líneas de código de éste método directamente en el archivo routes/web.php, reemplazando así completamente el llamado del facade Auth::routes()por la declaración manual de todas estas rutas.

Una vez que hayamos copiado las rutas, todavía debemos reemplazar el llamado a $this->, puesto que ya no estamos dentro de la clase Router, por el facade Route::.  Tampoco necesitamos los condicionales, así que también podemos eliminarlos para simplificar el código.

El archivo routes/web.php luciría de la siguiente forma:

Route::get('/', function () {
    return view('welcome');
});

// 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')->name('password.update');

// Email Verification Routes...
Route::emailVerification();

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

Ahora, si quisiéramos desactivar el módulo de registros tal como hicimos anteriormente, solamente tenemos que eliminar las rutas asociadas al módulo de registro.

Funcionamiento de las rutas de autenticación en la vista

En realidad es muy sencillo, si exploramos la vista app.blade.php ubicada en ~/projects/styde-auth/resources/views/layouts/app.blade.php de nuestro proyecto, para observar el código donde intervienen las rutas, tal como se aprecia en el siguiente ejemplo de la ruta de registro 'register'.

@if (Route::has('register'))
     <a class="nav-link" href="{{ route('register') }}">{{ __('Register') }}</a>
@endif

Por ejemplo podemos ver que únicamente se muestra el enlace de registro, cuando la ruta está registrada. Acá se refiere al nombre name con que identificamos la ruta y no a la URL.

Así que podemos cambiar las URLs, en routes/web.php sin que se afecte la lógica del proyecto. Por ejemplo, si ahora queremos que la URL de registro sea www.styde-auth/registro podemos hacer el cambio directo en el código, como se muestra a continuación:

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

De vuelta al navegador, si recargamos la página principal y utilizamos la opción de registro podemos ver que la URL ha cambiado a www.styde-auth.local/registro.

Esto funciona de nuevo porque Laravel está utilizando rutas con nombre, así que no importa los cambios de las rutas siempre que en nuestro layout hagamos referencia al helper route y al nombre de la ruta.

Personalizando la vista /home

El comando artisan make:auth también incorpora una ruta/home a una página de inicio con su correspondiente vista en layouts/home.blade.php, la cual  puedes personalizar a tu conveniencia.

Material Relacionado

Suscríbete a nuestro boletín

Te enviaremos publicaciones con consejos útiles y múltiples recursos para que sigas aprendiendo.

Regístrate hoy en Styde y obtén acceso a todo nuestro contenido.

Lección anterior Traducción de los módulos de registro, autenticación y recuperación de contraseña en Laravel