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
composer create-project laravel/laravel=4.2 autentificacion 
  • Configuramos la base de datos para crear en ella la tabla de usuarios
  • Realizamos la siguiente configuración
'seguridad' => array(
			'driver'    => 'mysql',
			'host'      => 'localhost',
			'database'  => 'tienda',
			'username'  => 'root',
			'password'  => 'root',
			'charset'   => 'utf8',
			'collation' => 'utf8_unicode_ci',
			'prefix'    => '',
		),
  • 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.
  • Ahora poblamos la tabla de usuarios y tocaremos un modelo para hacerlo

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