Usuario:ManuelRomero/Laravel/autentificacion/ejemplo

De WikiEducator
Saltar a: navegación, buscar


  • A continuación vamos a realizar un sistema de logín donde vemos todos los conceptos
  • Crearemos el proyecto indicando todos los pasos

Creando el proyecto

  • Creamos un proyecto nuevo
laravel new tiendaLaravel

Configuración config/database.php

  • Configuramos la base de datos para crear en ella la tabla de usuarios
  • Realizamos la siguiente configuración en el fichero config/database.php
  • Simplemente copiamos el de mysql y le cambiamos el nombre al conector
          'dwes' => [
            'driver' => 'mysql',
            'host' => env('DB_HOST', '127.0.0.1'),
            'port' => env('DB_PORT', '3306'),
            'database' => env('DB_DATABASE', 'forge'),
            'username' => env('DB_USERNAME', 'forge'),
            'password' => env('DB_PASSWORD', ''),
            'unix_socket' => env('DB_SOCKET', ''),
            'charset' => 'utf8mb4',
            'collation' => 'utf8mb4_unicode_ci',
            'prefix' => '',
            'strict' => true,
            'engine' => null,
        ],
  • Ahora en el fichero de entorno .env aportamos los datos a las variables
DB_CONNECTION=dwes
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=dwesLaravel
DB_USERNAME=root
DB_PASSWORD=root

Crear las tablas desde laravel con migraciones

  • Primero creamos la base de datos en nuestro gestor

CrearBaseDatos.png

  • Ahora si creamos la tabla migrations. Esta tabla es una especie de control de versiones que usa laravel para anotar todas las acciones que hace en la base de datos.
  • Para ello usando artisan
php artisan migrate:install
  • Al hacer esto podemos observar que nos ha creado una tabla en la base de datos que acabábamos de crear, que tiene 3 campos.

TablaMigration.png

  • Ahora vamos a crear la tabla usuarios desde laravel
  • Esto se conocerá como ejecutar una migración, la que nos cree la tabla usuarios
{0:02}~ ➭ php artisan make:migration crear_usuarios --create=usuarios 
Created Migration: 2017_04_01_220258_crear_usuarios
{0:02}~/laravel/tiendaLaravel ➭

Esta acción nos habrá creado un fichero databases/2017_04_01_220258_crear_usuarios.php Este fichero tiene dos métodos up() y down(). up creará la tabla en la base de datos y down la eliminará.

  • Ahora tendremos que escribir los nombres de los campos en la tabla, para ello usaremos el Shema que es un facade que nos facilita el uso de las acciones sobre la base de datos
  • Para ejecutar todos los ficheros o migraciones pendintes ejecutamos
php artisan migrate
  • Vemos cómo ha creado la tabla y los campos

TablaUsuarios.png


  • Idea del Middleware, como un software que se pone en medio entre el cliente y la respuesta
  • En la versión anterior se llamaban filtros
  • Laravel 5, ya incorpora un filtro para la autentificación. Tiene su propia plantilla y su propia tabla
  • Se puede ver accediendo directamente a la página
localhost:80001/auth/login

LaravelLogin.png

  • Ahora hay que mirar los ficheros responsables de esta acción
  • Los filtros o mi
  • En esta versión, también tenemos
  • Creamos las tablas con migration
php artisan make:migration tablaUsuarios
php artisan migrate
  • Ahora vemos que ha creado las tablas en la base de datos
  • Estas tablas con estos campos las ha creado debido a la migración que ya viene por defecto en laravel 5

Podemos verlas en ./proyectoLaravel/database/migrations

2014_10_12_000000_create_users_table.php
2014_10_12_100000_create_password_resets_table.php
2015_05_28_090127_tablaUsuarios.php
  • Por su puesto que podemos añadir o quitar (?) campos de estas tablas
  • Si lo hacemos debermos de actulizar la clase app/Services/Register-php
  • Para modificar en la creación de la tabla deberíamos de modificar el contenido de la clase de la migración 2014_10_12_000000_create_users_table.php antes de ejecutarse, o si no crear una nueva migración con un alter table de la tabla en cuestión para añadir el nuevo campo.

manolo@pitufin:~/instituto/dwesDistancia/empresas/database/migrations$


  • Editamos el fichero que ha creado la migración y añadimos los campos que necesitamos en el método up
...
public function up(){
          Schema::create('usuarios', function($table){
             $table->increments('id');
             $table->string('password');
             $table->string('email');
             $table->string('usuario');
             $table->timestamps();
             $table->rememberToken();
        });
}
public function down(){
       Schema::drop('usuarios');
}
 
*Ahora ejecutamos la migración para que se cree la tabla
 php artisan migrate
*Ahora añadimos el campo para poder recordar el usuario conectado
 php artisan make:migration  tablaUsuarios
php artisan migrate:make tablaUsuarios2
*Cargamos lo que queremos que se ejecute en el método up del nuevo fichero creado
<source lang=php>
....
 Schema::table('usuarios', function($tabla){
            $tabla->rememberToken();                                
 });
  • Ejecutamos la migracion
php artisan migrate
  • Y observamos como nos ha creado la tabla con los campos deseados.
  • Si queremos deshacer lo hecho, es decir ejecutar los métodos down de la última migración creada
php artisan migrate:rollback

RollbackUsuarios.png

  • Si quisiéramos deshacer todas las migraciones reset
php artisan migrate:rollback

ResetMigration.png

  • Si queremos deshacer todas las migraciones y que se vuelvan a ejecutar, por ejemplo por que hemos modificado la estructura de la tabla y por comodidad eliminamos todo y lo volvemos a crear: refrehs
php artisan migrate:refresh

RefreshMigration.png

resetMigration.png

  • Ahora poblamos la tabla de usuarios y tocaremos un modelo para hacerlo

Poblando la tabla con seed

  • Laravel también nos permite poblar las tablas
  • Para ello crearemos ficheros en la carpeta seed
  • Es habitual que cada tabla tenga un seeder o fichero de poblar, pero puede haber varios ficheros seeder para una tabla, no hay restricción en ese aspecto
 php artisan  make:seeder UsuarioTableSeeder

SeederUsuarioTableSeeder.png

  • Primero cargamos este seeder desde el fichero DataBaseSeeder que ya teníamos en nuestro sistema
  • Ahora escribimos la carga de datos como contenido del método run()
  • Para ello escribiremos el siguiente código
  • Como vemos usamos el componente Carbon. si no funcionara lo especificamos en composer incluyéndolo en los paquetes requeridos
  "require": {
        //.......
        "nesbot/carbon": "~1.14"
    },

y volvemos a cargar composer

composer update
  • Para ejecutar la carga podemos hacerlo recargando todas las migraciones con la opción --seed, o ejecutando solo la carga de datos
php artisan migrate:refresh --seed
  • O bien
php artisan db:seed

Y tras hacerlo vemos los datos cargados SeedUsuarios.png

Icon present.gif
Tip: Para cargas masivas ver el componente de faker https://github.com/fzaninotto/Faker


Creando el modelo

  • Si vamos a la carpeta de models, vemos que existe un modelo creado llamado users. Este modelo se ha creado por que está asociado a la clase Auth que a continuación comentaremos. Para personalizar un poco todo y entender mejor el proceso vamos a modificar este modelo y llamarle Usuario y a la tabla asociada al modelo usuarios
  • Esto lo hacemos cambiando en el nombre del fichero
/app/Models/User.php lo cambiamos a /app/Models/Usuario.php
  • Dentro del fichero donde ponía
...
class User extends Eloquent ...
...
protected $table = 'users';
..
  • Ponemos
...
 
class Usuario extends Eloquent ...
...
protected $table = 'usuarios';
...
  • Ahora que ya tenemos el modelo Usuario con su tabla, que previamente hemos creado vamos a poblarla

Poblando la tabla

  • Para ello como ya sabemos en la carpeta seed, cremos una nuevo clase que extienda de Seeder; por ejemplo la llamamos PoblarUsuariosSeeders, y usando el modelo dentro del método run, creamos un nuevo registros
  • OBservamos que usamos la clase Hash para cifrar el contenido de la password
class PoblarUsuariosSeeders extends Seeder {
    //put your code here
     public function run()
    { //Usando el modelo creamos un nuevo registro. Tambien se puede hacer con el método save
       Usuario::create(array(
            'usuario'  => 'manolo',
            'email'     => 'admin@admin.com',
            'password' => Hash::make('manolo') // Hash::make() nos va generar una cadena con nuestra contraseña encriptada
    }
}
  • Para llamar a este método modificamos el método run de la clase DataBaseSeeder.php
...
	public function run()
	{
		Eloquent::unguard();
                $this->call('DatosUsuarios'); //Esta es la línea que añadimos
        }
...
  • Ahora ejecutando desde la consola con artisan tendremos el nuevo registro creado
php artisan db:seed
  • Verificamos que tenemos el registro creado

Auth.php

Como hemos modificao el modelo, vamos a indicar a la clase de autentificación cual es el modelo que usaremos para autentificar usuarios que sera Usuario

...
 
	'model' => 'Usuario',
...
	'table' => 'usuarios',
  • De momento no tocamos la gestion de como recordar la password

Preparando las rutas

  • Para este ejemplo vamos a tener la siguiente sitiación
  • Un usuario solo puede acceder al sitio web si previamente se ha identificado
  • Para identificarse usaremos el login que tenemos de la tienda
  • Una vez logueado le daremos la opción de desloguearse
  • No lo hemos visto anteriormente pero es muy intuitivo, y es el tema de los filtros
  • En este caso le estamos diciendo que existen ciertas rutas que solo cargará si el usuario previamente se ha identificado
  • Con solo hacer esto no tenemos que validar el usuario ante ninguna acción.
  • El código es tan sencillo como
Route::get('/', ['before'=>'auth']
<?php
 
// Nos mostrará el formulario de login.
Route::get('login', 'Autentificacion@formularioLogin');
 
// Validamos los datos de inicio de sesión.
Route::post('login', 'Autentificacion@validaLogin');
 
// Nos indica que las rutas que están dentro de él sólo serán mostradas si antes el usuario se ha autenticado.
Route::group(array('before' => 'auth'), function()
{
    // Esta será nuestra ruta de bienvenida.
    Route::get('/', 'Accion@index');
    Route::get('logout', 'Autentificar@logOut');
});
/*
Otra forma de escribir lo mismo
 
Route::get('/',['before'=>'auth','uses'=>'Accion@index']);
Route::get('/logout',['before'=>'auth','uses'=>'Autentificacion@logout']);
*/
  • Usaremos el formulario usado para la tienda
  • Para ello usaremos tienda.css. Este fichero lo debemos copiar en la carpeta

/public/css/tienda.css

  • Creando los controladores
php artisan controller:make Autentificacion
php artisan controller:make Accion
  • Incluimos los métodos especificados en el router.php dentro de los controladores
muestraLogion()
  • En este método queremos mostrar el formulario de login si el usuario no está autentificado, si no simplemente mostramos el formulario para que se loguee.
   public function formularioLogin(){
       //Si el usuario ya está autentificado directamente vamos a enviarle a la página inicial, y si no mostramos el menu
       if (Auth::check()){
           return Redirect::to('/');
       }
       return View::make('formularioLogin');
   }

</source>

  • Ahora haremos el vista formularioLogin.blade.php
<!DOCTYPE html>
<!-- Desarrollo Web en Entorno Servidor -->
<!-- Ejemplo Tienda Web: login.php -->
<html>
    <head>
        <meta http-equiv="content-type" content="text/html; charset=UTF-8">
        {{ HTML::style('css/tienda.css') }}
        <link href="tienda.css" rel="stylesheet" type="text/css">
        <title>Ejemplo Tema 4: Login Tienda Web</title>
    </head>
   <body>
    <div id='error'>
     {{-- Preguntamos si hay algún mensaje de error y si hay lo mostramos  --}}
        @if(Session::has('mensaje'))
            {{ Session::get('mensaje') }}
        @endif
    </div>
        <div id='login'>
            {{ Form::open(array('url'=>'login')) }}
            <fieldset >
                <legend>Login</legend>
 
                <div class='campo'>
                    {{ Form::label('nombre', 'Nombre de usuario') }}    
                    {{ Form::text('nombre', 'Sin nombre') }}    
                </div>
                <div class='campo'>
                    {{ Form::label('password', 'Password') }}    
                    {{ Form::text('password') }}    
                </div>
                <div class='campo'>
                    {{ Form::submit('validar') }}
                </div>
            </fieldset>
            {{ Form::close() }}
    </body>
</html>
  • Vemos como en este caso vamos a consultar a ver si hay un mensaje de error
  • Si simplemente accediera al valor de la variable, a diferencia de smarty, aquí sí que me daría un error.
  • Como usa css, copiamos el fichero tienda.css, en la carpeta /public/css/tienda.css
validaLogin
  • Este método contiene la validación de nuestro usuario
  • Lo que queremos es que si se valida correctamente entremos a una página del sitio, y si no que, vuelva a mostrar la pantalla de validarse, y que me muestre un mensaje de error
  • Vemos directamente el código
 public function validaLogin(){
 
        // Recuperamos los datos de usuario y password en dos variablesGuardamos en un arreglo los datos del usuario.
        $usuario = Input::get('nombre');
        $pass = Input::get('password');
        // Validamos los datos y además mandamos como un segundo parámetro la opción de recordar el usuario.
        if(Auth::attempt(['usuario'=>$usuario, 'password'=>$pass])){
            return Redirect::to('/');
 
        {
        // En caso de que la autenticación haya fallado manda un mensaje al formulario de login 
            // también regresamos los valores enviados con withInput().
        }
        return Redirect::to('login')
                    ->with('mensaje', 'Los datos son incorrectos')
                    ->withInput();
    }
 
    }
  • Ahora nos queda escribir la plantilla del sitio hello.php en la carpeta de views
  • Editamos el fichero ya existente y modificamos el body
....
<body>
	<div class="welcome">
          <h1>Wellcome a tu sitio web  {{ Auth::user()->name; }}</h1>
           <a href="/logout">Salir.</a>
    </div>
</body>
</html>
<body>

Wellcome a tu sitio web {{ Auth::user()->name; }}

          <a href="/logout">Salir.</a>

</body> </html

logout
  • Para terminar nos falta implementar el método logout

Idioma no válido.

Necesita especificar un idioma como esto: <source lang="html4strict">...</source>

lenguajes soportados para sintaxis remarcada:

4cs, 6502acme, 6502kickass, 6502tasm, 68000devpac, abap, actionscript, actionscript3, ada, algol68, apache, applescript, apt_sources, arm, asm, asp, asymptote, autoconf, autohotkey, autoit, avisynth, awk, bascomavr, bash, basic4gl, bf, bibtex, blitzbasic, bnf, boo, c, c_loadrunner, c_mac, caddcl, cadlisp, cfdg, cfm, chaiscript, cil, clojure, cmake, cobol, coffeescript, cpp, cpp-qt, csharp, css, cuesheet, d, dcl, dcpu16, dcs, delphi, diff, div, dos, dot, e, ecmascript, eiffel, email, epc, erlang, euphoria, f1, falcon, fo, fortran, freebasic, freeswitch, fsharp, gambas, gdb, genero, genie, gettext, glsl, gml, gnuplot, go, groovy, gwbasic, haskell, haxe, hicest, hq9plus, html4strict, html5, icon, idl, ini, inno, intercal, io, j, java, java5, javascript, jquery, kixtart, klonec, klonecpp, latex, lb, ldif, lisp, llvm, locobasic, logtalk, lolcode, lotusformulas, lotusscript, lscript, lsl2, lua, m68k, magiksf, make, mapbasic, matlab, mirc, mmix, modula2, modula3, mpasm, mxml, mysql, nagios, netrexx, newlisp, nsis, oberon2, objc, objeck, ocaml, ocaml-brief, octave, oobas, oorexx, oracle11, oracle8, oxygene, oz, parasail, parigp, pascal, pcre, per, perl, perl6, pf, php, php-brief, pic16, pike, pixelbender, pli, plsql, postgresql, povray, powerbuilder, powershell, proftpd, progress, prolog, properties, providex, purebasic, pycon, pys60, python, q, qbasic, rails, rebol, reg, rexx, robots, rpmspec, rsplus, ruby, sas, scala, scheme, scilab, sdlbasic, smalltalk, smarty, spark, sparql, sql, stonescript, systemverilog, tcl, teraterm, text, thinbasic, tsql, typoscript, unicon, upc, urbi, uscript, vala, vb, vbnet, vedit, verilog, vhdl, vim, visualfoxpro, visualprolog, whitespace, whois, winbatch, xbasic, xml, xorg_conf, xpp, yaml, z80, zxbasic


/*
Volvemos a mostrar el formulario de login indicando que se cerró la sesion
*/
    public function logOut()
    {
        Auth::logout();
        return Redirect::to('login')
                    ->with('mensaje', 'Tu sesión ha sido cerrada.');
    }