Usuario:ManuelRomero/Laravel/autentificacion/ejemplo
- 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 migrate:make tablaUsuarios php artisan migrate
- 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 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', 'AuthController@showLogin'); // Validamos los datos de inicio de sesión. Route::post('login', 'AuthController@postLogin'); // 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('/', function() { return View::make('hello'); }); // Esta ruta nos servirá para cerrar sesión. Route::get('logout', 'AuthController@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 muestraLogin(){ //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='erro'> {{-- 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>
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.'); }