|
|
(30 revisiones intermedias por el mismo usuario no mostrado) |
Línea 1: |
Línea 1: |
| {{:Usuario:ManuelRomero/micursos/Laravel/autentificacion/nav}} | | {{:Usuario:ManuelRomero/micursos/Laravel/autentificacion/nav}} |
| {{__TOC__}} | | {{__TOC__}} |
− | | + | https://www.youtube.com/watch?v=BXXmboZRLYo |
− | ===Conceptos generales===
| + | <div class=parrafo> |
− | *La autentificación es otra de las muchas tareas comunes en cualquier aplicación que en el fondo no es parte de la aplicación sino un nivel de seguridad o compromiso que nuestra app pretende adoptar.
| + | <!-- |
− | *Laravel gestiona la autentificación en varios ficheros según vamos a ver a continuación.
| + | {{MRM_actividad|Title=Para recordoar| |
− | *Laravel nos ofrece la autentificación como un servicio.
| + | ;Instalacion |
− | *Laravel tiene preconfigurada la autentificación la cual la podemos activar de manera sencilla.
| + | composer require "laravel/breeze" |
− | ====Autentificación implementada en Laravel====
| + | php artisan breeze:install |
− | ;Fichero de configuración
| + | (tener instalado nodejs y npm) |
− | config/auth.php
| + | npm install |
− | | + | npm run dev |
− | *Un listado de este fichero por defecto en la versión 5.2.32 (ver fichero en un proyecto para comentarios)
| + | *Las migraciones |
− | {{Plegable|hide|config.php|
| + | Establecer los datos de conexión en el fichero .env |
− | <source lang=php>
| + | ejecutar las migracionesw |
− | ?php | + | |
− | return array(
| + | |
− | | + | |
− | return [
| + | |
− | //Autentificaciones por defecto
| + | |
− | | + | |
− | 'defaults' => [
| + | |
− | 'guard' => 'web',
| + | |
− | 'passwords' => 'users',
| + | |
− | ],
| + | |
− | | + | |
− | //Configuración de guards *cómo los usuario se autentifican en cada solicitud*
| + | |
− | 'guards' => [
| + | |
− | 'web' => [
| + | |
− | 'driver' => 'session',
| + | |
− | 'provider' => 'users',
| + | |
− | ],
| + | |
− | | + | |
− | 'api' => [
| + | |
− | 'driver' => 'token',
| + | |
− | 'provider' => 'users',
| + | |
− | ],
| + | |
− | ],
| + | |
− | 7
| + | |
− | //Configuración de providers
| + | |
− | *como los usuario recuperar su almacenamiento permanente e.d donde está
| + | |
− | almacenadas las credenciales para verificar la autentificación*/
| + | |
− | 'providers' => [
| + | |
− | 'users' => [
| + | |
− | 'driver' => 'eloquent',
| + | |
− | 'model' => App\User::class,
| + | |
− | ],
| + | |
− | | + | |
− | // 'users' => [
| + | |
− | // 'driver' => 'database',
| + | |
− | // 'table' => 'users',
| + | |
− | // ],
| + | |
− | ],
| + | |
− | //configuración para resetear la password
| + | |
− | | + | |
− | 'passwords' => [
| + | |
− | 'users' => [
| + | |
− | 'provider' => 'users',
| + | |
− | 'email' => 'auth.emails.password',
| + | |
− | 'table' => 'password_resets',
| + | |
− | 'expire' => 60,
| + | |
− | ],
| + | |
− | ],
| + | |
− | | + | |
− | ];
| + | |
− | </source>
| + | |
− | }}
| + | |
− | {{MRM_Puntos clave|Como podemos ver '''''la autentificación''''' en Laravel está configurada por dos elementos que podemos modificar: '''''Guards''''' y '''''Providers'''''.
| + | |
− | {{MRM_Definicion|Title=Guards y Providers|
| + | |
− | *'''''Guards''''' definen cómo los usuarios son autentificados en cada solicitud. Por ejemplo sesiones o tokens | + | |
− | *'''''Providers''''' Definen cómo se obtienen los datos almacenados de manera persistente en el sistema. (Base de datos, tabla, campos ...)
| + | |
− | }}
| + | |
− | }}
| + | |
− | | + | |
− | ====Activando la autentificación por defecto de laravel====
| + | |
− | Usamos la línea de comandos con artisan, creamos el módulo '''''auth''''' en nuestra aplicación
| + | |
| <source lang=bash> | | <source lang=bash> |
− | {23:44}~ ➭ php artisan make:auth
| + | php artisan migrate |
− | Authentication scaffolding generated successfully.
| + | |
− | {0:29}~ ➭
| + | |
| </source> | | </source> |
− | {{MRM_Pregunta|Title=Qué ha ocurrido|
| + | ;Para usar |
− | ;1.-Se ha creado 1 controlador (app/Http/Controller/HomeController.php) | + | |
− | {{MRM_Actividad|Title=Otros controladores disponibles|
| + | |
− | Toda app dispone de 4 controladores para gestionar los usuarios
| + | |
− | app/Http/Controller/Auth
| + | |
− | [[Imagen:controller_auth.png|400px|center]]
| + | |
− | }}
| + | |
− | ;2.-Se ha añadido nuevas entradas en las rutas routes/web.app
| + | |
− | <source lang=php>
| + | |
− | //...
| + | |
− | Auth::routes();
| + | |
− | Route::get('/home', 'HomeController@index');
| + | |
− | //...
| + | |
− | </source>
| + | |
− | ;3.-Se han creado las siguientes vistas /resources/view/
| + | |
− | [[Imagen:laravel_auth2.png|400px|center]]
| + | |
− | }}
| + | |
− | {{MRM_Actividad|Title=Controladores disponibles para autentificar|
| + | |
− | ;HomeController
| + | |
− | *Este controlador se genera al activar el módulo '''''auth'''''.
| + | |
− | *Con él podremos gestionar las solicitudes después haber sido logueados.
| + | |
− | ;RegisterController
| + | |
− | Registro del usuarios
| + | |
− | ;LoginController
| + | |
− | Gestiona la autentificación.
| + | |
− | ;ForgotPasswordController
| + | |
− | Gestión de una password olvidada por parte de un usuario
| + | |
− | ;ResetPasswordController
| + | |
− | Lógica para controlar resetear una password
| + | |
− | }}
| + | |
− | {{MRM_Actividad|Title=Invocar a los formuarios|
| + | |
− | *Podemos invocar a los formularios desde nuestra vista
| + | |
− | <source lang=html5>
| + | |
− | <a class="btn href= {{ route('register') }}>REGISTRATE</a>
| + | |
− | <a class="btn href={{ route('login') }}>ACCEDER</a>
| + | |
− | </source>
| + | |
− | }}
| + | |
− | {{MRM_Actividad|Title=Establecer enlaces con logín|
| + | |
− | *Los '''''middeleware''''' son filtros que se pueden poner antes o después de acceder a un recurso establecido en '''''web.php'''''
| + | |
− | *De esta forma podemos establecer que para acceder a determinadas páginas o recursos hay que loguearse previamente
| + | |
− | *Por ejemplo tenemos varias páginas con restricciones de acceso, informes, alumnos y empresas serían recursos que necesitarían login para acceder
| + | |
− | <source lang=php>
| + | |
| | | |
− | Route::get('/about', function () {
| + | *Para establecer routas protegidas (solo accesibles si logueado) |
− | return view('about');
| + | |
− | });
| + | |
− | Route::get('/contacta', function () {
| + | |
− | return view('contacta');
| + | |
− | });
| + | |
| | | |
− | Route::get('/alumnos', function () { | + | Route::get("xx", function (){ |
− | return view('alumnos');
| + | return view("xxxxxx");})->middelware("auth"); |
− | })->middleware('auth');
| + | |
− | Route::get('/informes', function () {
| + | |
− | return view('practicas');
| + | |
− | });
| + | |
− | Route::get('/empresas', function () {
| + | |
− | return view('empresas');
| + | |
− | })->middleware('auth'); | + | |
| | | |
− | | + | *Si en una vista quiero si estoy logueado |
− | | + | |
− | | + | |
− | </source>
| + | |
− | }}
| + | |
− | | + | |
− | | + | |
− | {{Tip|En muchos casos, activar la autentificación por defecto es suficiente, pero conviene conocer cómo modificar determinados comportamientos por defecto}}
| + | |
− | {{MRM_Actividad|Ttitle=Personalizando la autentificación|
| + | |
− | #Página inicial una vez logueado.
| + | |
− | #Campos para validar al ususario.
| + | |
− | #Protegiendo rutas.
| + | |
− | }}
| + | |
− | | + | |
− | ===Página inicial===
| + | |
− | <br />
| + | |
− | {{MRM_Puntos clave|Title=Página a redirigir una vez logueado|
| + | |
− | ;Atributo
| + | |
| <source lang=php> | | <source lang=php> |
− | protected redirectTo='/home';
| + | @auth |
− | </source> | + | <h2>Conectado como {{auth()->user()->name}}</h2> |
− | De los controladores:
| + | <form action="{{route("logout")}}" method='post'> |
− | ;LoginController.php
| + | @csrf |
− | ;RegisterController.php
| + | <x-button>Desconectar</x-button> |
− | ;ResetPasswordController.php
| + | </form> |
− | Se puede especificar también el método
| + | @endauth |
− | <source lang=php>
| + | @guest |
− | protected function redirectTo()
| + | <a href="{{route("login")}}"><x-button>Login</x-button></a> |
− | {
| + | <a href="{{route("register")}}"><x-button>Registrarme</x-button></a> |
− | return '/path';
| + | |
− | } | + | |
− | </source> | + | |
− | {{Tip|El método tiene preferencia sobre el atributo}} | + | |
− | }}
| + | |
− | ===Protegiendo rutas===
| + | |
− | *Establecer páginas o rutas, que solo se sirven si se está logueado.
| + | |
− | *Si tengo una ruta de una página
| + | |
− | <source lang=php> | + | |
− | Route::get('/productos', 'ControladorProductos@get')
| + | |
− | </source> | + | |
− | *Si la quiero proteger con autentificación:
| + | |
− | <source lang=php> | + | |
− | Route::get('/productos', 'ControladorProductos@get')->middleware('auth');
| + | |
− | </source> | + | |
| | | |
| + | @endguest |
| | | |
− |
| |
− | <br />
| |
− |
| |
− |
| |
− |
| |
− |
| |
− |
| |
− | {{MRM_Puntos clave|Title=Migraciones para la autentificación|
| |
− | ;1.-Creamos la base de datos
| |
− | ;2.-Configuramos correctamente el fichero
| |
− | <source lang=bash>
| |
− | config/database.php
| |
− | </source>
| |
− | Valores de parámetros aportados en el fichero '''''.env'''''
| |
− | [[Imagen:usuariosLaravelMigraciones.png]]
| |
− | ;3.-Instalamos el módulo de migraciones
| |
− | <source lang=bash>
| |
− | php artisan migrate:install
| |
− | </source>
| |
− | *Nos habrá creado la tabla '''''migration''''' en la base de datos especificada
| |
− | Migration table created successfully.
| |
− | ;4.- Ejecutamos la migración que viene por defecto
| |
− | <source lang=bash>
| |
− | php artisan migrate
| |
| </source> | | </source> |
− | Nos generará la siguiente salida indicando que ha creado dos tablas
| + | *Recordar las rutas creadas |
− | Migrating: 2014_10_12_000000_create_users_table | + | routes/auth.php |
− | Migrated: 2014_10_12_000000_create_users_table
| + | *Para verlas |
− | Migrating: 2014_10_12_100000_create_password_resets_table | + | php artisan route:list |
− | Migrated: 2014_10_12_100000_create_password_resets_table | + | *Controladores creados |
− | }}
| + | http/controllers/auth |
− | {{Nota|
| + | |
− | #Si la primera vez que intentáis registrar un usuario no deja, cierra el servidor y vuélvelo a arrancar y prueba
| + | |
− | #Verifica el fichero de configuración de las conexiones
| + | |
− | #Busca en stackoverflow ...
| + | |
− | }}
| + | |
| | | |
| + | ;Modificar la página a la que me redirige una vez logueado |
| + | Const HOME en Providers/RouteServiceProviders |
| | | |
− | {{MRM_Puntos clave|Title=Campo de validacion|
| |
− | *Para identificarte por defecto pide el email
| |
− | *Si quieres que solicite otro campo:
| |
− | :1.- Establece el nombre del campo en el controlador LoginControler
| |
− | <source lang=php>
| |
− | public function username(){
| |
− | return ("name"); //Ahora será este el campo por el que se validará
| |
− | }
| |
− | :2.-Actualiza la plantilla correspondiente
| |
− | </source>
| |
| | | |
| + | }}--> |
| | | |
| | | |
− | }}
| |
| | | |
| | | |
| | | |
| | | |
| + | ===Conceptos generales=== |
| + | *La autentificación es otra de las muchas tareas comunes en cualquier aplicación que en el fondo no es parte de la aplicación sino un nivel de seguridad o compromiso que nuestra app pretende adoptar. |
| + | *Laravel gestiona la autentificación en varios ficheros según vamos a ver a continuación. |
| + | *Laravel nos ofrece la autentificación como un servicio. |
| + | *Laravel tiene preconfigurada la autentificación la cual la podemos activar de manera sencilla. |
| + | *Sistemas de authentificación posibles con laravel: |
| + | #Autentificación básica con http |
| + | #Breeze |
| + | #Fortity |
| + | #Jetstream |
| + | #Sanctum |
| + | #Passport |
| + | <!-- |
| + | ====Autentificación básica con http==== |
| | | |
| | | |
| | | |
− | | + | ====Autentificación implementada en Laravel: Breeze==== |
− | | + | *Este paquete aporta los siguientes elementos: |
− | *La idea es usar un milddeware, entendido como un software intermedio entre la página que solicito y la que el servidor me entrega
| + | ;En el backend: |
− | *De esta forma siempre que solicite una página que necesite estar registrado, antes de servirla voy a verificar si estoy o no registrado
| + | Vistas |
− | *Anteriormente (en veriones 4 o anterior), este concepto se conocía como filtro, ahora en esta versión se conoce como ya hemos comentado como '''''Middleware'''''.
| + | Rutas y controladores |
− | *La idea es antes de cargar una página que se verifica ver si el usuario está autentificado
| + | ;En el frontend |
− | *La descripción algorítmica sería
| + | Tailwindcss/blade |
− | 1.- Si está registrado entrego la página solicitada | + | ;Acciones implementadas: |
− | 2.- Si no lo está le redirijo a una página de logueo para que se acredite o registre | + | Registro |
− | 2.-1 Cuando lo haga le doy paso a la página solicitada | + | Login |
− | 3.- En caso de no autentificarse le doy una información de error. | + | Logout |
− | *En Laravel todo está preparado y configurado, para que con unas pequeñas acciones podamos adaptar esa configuración a nuestras necesidades. Bastaría con hacer las siguientes acciones como indican en la página de referencia
| + | Resestablecimiento de contraseña |
− | <source lang=bash>
| + | Confirmación por email |
− | php artisan make:auth and | + | |
− | php artisan migrate
| + | </div> |
− | </source> | + | --> |
− | Entonces acceemos a nuestra app
| + | |
− | http://localhost:8000/register
| + | |
− | | + | |
− | ===Gestionar los datos de la autentificacion===
| + | |
− | *Por defecto tenemos un modelo llamado '''''User''''' con su tabla por defecto '''''users'''''
| + | |
− | *Esa tabla logicamente hay que construirla. Podemos hacerlo con migraciones.
| + | |
− | Entre otros campos debe contener
| + | |
− | *campo remenber_token de 100 caracteres, permitiendo el valor nulo. Campo usado para recordar entre sesiones
| + | |
− | *Para incluir este campo con migraciones usaremos
| + | |
− | <source lang=php>
| + | |
− | $table->rememberToken()
| + | |
− | </source>
| + | |
− | *Para gestionar la validación Laravel incluye el modelo '''''app/User.php'''''
| + | |
− | | + | |
− | ===Gestión de contraseñas===
| + | |
− | ;make crear una contraseña
| + | |
− | Hash::make('secret');
| + | |
− | ;check validar una contraseña
| + | |
− | Hash::check('secret',$hashedPassword);
| + | |
− | ;Tengo que volver a hacer el hash de una contraseña
| + | |
− | if (Hash::needsRehash($hashed))
| + | |
− | {
| + | |
− | $hashed = Hash::make('secret');
| + | |
− | }
| + | |