En este tutorial vamos a crear un pequeño ejemplo de login con Laravel. Para los nuevos en el tema aquí les dejo unos enlaces donde encontrarán información de cómo instalar y configurar Laravel:
- En Ubuntu:
- Instalar Laravel en Ubuntu
En Windows: - Cómo instalar Laravel y Composer
Este tutorial consta de tres partes:
- Base de datos
- Programación
- Diseño
Base de datos
Primero que nada vamos a crear una base de datos con el nombre “login” (pueden usar phpMyadmin o la herramienta que más les guste).

Ahora vamos a configurar Laravel, para eso vamos al archivo app/config/database.php, por default Laravel viene configurado para usar mysql así que solamente vamos a cambiar los datos de conexión:
Código :
'mysql' => array( 'driver' => 'mysql', 'host' => 'localhost', 'database' => login, 'username' => 'root', 'password' => 'password', 'charset' => 'utf8', 'collation' => 'utf8_unicode_ci', 'prefix' => '', ),
Ahora vamos a usar las migraciones de artisan para crear la tabla users, para eso vamos a nuestra terminal y dentro de nuestro proyecto ejecutamos los siguientes comandos:
Código :
php artisan migrate:install
Nos mostrará un mensaje similar al siguiente:
Código :
Migration table created successfully.
Y nos creará una tabla llamada migrations en nuestra base de datos.
Ahora con el siguiente comando creamos una nueva migración llamada create_table_users:
Código :
php artisan migrate:make create_users_table
Nos mostrará un mensaje similar a:
Código :
Created Migration: 2014_01_19_200752_create_users_table Generating optimized class loader
Nos ha creado un archivo en app/database/migrations/2014_01_19_200752_create_users_table.php (Si nos damos cuenta le agrego la fecha al nombre de nuestro archivo) ahora lo modificamos hasta dejarlo de la siguiente manera:
Código :
<?php use Illuminate\Database\Migrations\Migration; class CreateUsersTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { // Creamos la tabla users con los campos más básicos. Schema::create('users',function($table){ $table->increments('id'); $table->string('name',100); $table->string('username',100)->unique(); $table->string('email',100)->unique(); $table->string('password'); $table->timestamps(); }); } /** * Reverse the migrations. * * @return void */ public function down() { // Eliminar la tabla users Schema::drop('users'); } }
Para ejecutar la migración ejecutamos el siguiente comando:
Código :
php artisan migrate
Y nos mostrará el siguiente mensaje:
Código :
Migrated: 2014_01_19_200752_create_users_table
Si quieren tener más información sobre migraciones pueden revisar el tutorial Configurar Base de Datos y crear tablas con Laravel.
Bien, ya tenemos nuestra base de datos con la tabla users pero ahora necesitamos un usuario inicial, para eso creamos el archivo UsersTableSeeder.php en app/database/seeds/ con el siguiente código:
Código :
<?php /** * Agregamos un usuario nuevo a la base de datos. */ class UserTableSeeder extends Seeder { public function run(){ User::create(array( 'username' => 'admin', 'email' => '[email protected]', 'name'=> 'Administrator', 'password' => Hash::make('admin') // Hash::make() nos va generar una cadena con nuestra contraseña encriptada )); } }
Ahora nos vamos a nuestro archivo app/database/seeds/DatabaseSeeder.php vamos a ver que Laravel por default ya tiene un ejemplo comentado para agregar nuestra clase UserTableSeeder, así que solo la descomentamos y quedará de la siguiente manera:
Código :
<?php class DatabaseSeeder extends Seeder { /** * Run the database seeds. * * @return void */ public function run() { Eloquent::unguard(); $this->call('UserTableSeeder'); } }
Vamos a nuestra terminal y ejecutamos el siguiente comando:
Código :
php artisan db:seed
Nos mostrará un mensaje similar a este:
Código :
Seeded: UserTableSeeder
Listo ya tenemos nuestro usuario inicial.
Programación
En esta parte vamos a configurar nuestras rutas, validar los datos de inicio de sesión y gestionar el cierre de sesión.
Vamos a editar nuestro archivo de rutas (app/routes.php).
Por default sólo vamos a tener la siguiente ruta que es la que nos da la bienvenida.

Lo editamos para que quede de la siguiente manera:
Código :
<?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'); });
Ahora ya tenemos registradas 3 rutas:
Código :
/
Nos mostrará un mensaje de bienvenida y un link para cerrar sesión.
Código :
/login
Nos mostrará un formulario pidiendo los datos para iniciar sesión.
Código :
/logout
La usaremos para terminar la sesión y volver a mostrar el formulario de login.
Y como está comentado en código sólo se puede tener acceso a / y /logout si antes has iniciado sesión.
Empezaremos con la ruta /login:
Código :
Route::get('login', 'AuthController@showLogin');
Como vemos estamos haciendo uso de un controller llamado AuthController y haciendo referencia a la función showLogin ¿que quiere decir esto? que cuando alguien mande llamar la ruta /login laravel ejecutará la función showLogin de nuestro UserController.
Ahora vamos a nuestro carpeta app/controllers/ y creamos un archivo llamado AuthController.php y agregamos el siguiente código:
Código :
<?php class AuthController extends BaseController { /* |-------------------------------------------------------------------------- | Controlador de la autenticación de usuarios |-------------------------------------------------------------------------- */ }
Desde este archivo controlaremos la autenticación de los usuarios.
Procedemos a agregar la función showLogin(), agregando el siguiente código dentro de la clase que acabamos de crear:
Código :
/** * Muestra el formulario para login. */ public function showLogin() { // Verificamos que el usuario no esté autenticado if (Auth::check()) { // Si está autenticado lo mandamos a la raíz donde estara el mensaje de bienvenida. return Redirect::to('/'); } // Mostramos la vista login.blade.php (Recordemos que .blade.php se omite.) return View::make('login'); }
Aunque ya creamos nuestra función showLogin() aún no nos va responder laravel cuando mandemos llamar la ruta /login ya que nos falta crear la vista.
Ahora nos dirigimos a nuestra carpeta app/views/ y creamos un archivo llamado login.blade.php y le agregamos el siguiente código:
Código :
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Login</title> </head> <body> {{-- Preguntamos si hay algún mensaje de error y si hay lo mostramos --}} @if(Session::has('mensaje_error')) {{ Session::get('mensaje_error') }} @endif {{ Form::open(array('url' => '/login')) }} {{ Form::label('usuario', 'Nombre de usuario') }} {{ Form::text('username', Input::old('username')); }} {{ Form::label('contraseña', 'Contraseña') }} {{ Form::password('password'); }} {{ Form::label('lblRememberme', 'Recordar contraseña') }} {{ Form::checkbox('rememberme', true) }} {{ Form::submit('Enviar') }} {{ Form::close() }} </body> </html>
Bien ahora sí, ya tenemos lista nuestra vista para el login. Si entramos desde nuestro navegador a ver nuestro proyecto nos redireccionará a /login mostrando un formulario similar al siguiente:

Lo sé, se ve muy feo pero más tarde regresaremos a darle un toque de diseño por ahora nos enfocaremos en hacerlo funcionar.
Ahora tenemos que decirle a Laravel qué hacer cuando se mande el submit al formulario del login, en nuestro archivo routes.php ya tenemos definida esa ruta:
Código :
Route::post('login', 'AuthController@postLogin');
Solo falta agregar la siguiente función dentro de nuestro controller AuthController:
Código :
/** * Valida los datos del usuario. */ public function postLogin() { // Guardamos en un arreglo los datos del usuario. $userdata = array( 'username' => Input::get('username'), 'password'=> 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($userdata, Input::get('remember-me', 0))) { // De ser datos válidos nos mandara a la bienvenida return Redirect::to('/'); } // En caso de que la autenticación haya fallado manda un mensaje al formulario de login y también regresamos los valores enviados con withInput(). return Redirect::to('login') ->with('mensaje_error', 'Tus datos son incorrectos') ->withInput(); }
Si intentamos iniciar sesión con valores incorrectos deberá mandar al mismo formulario con un mensaje de error y de lo contrario nos mandará a la vista default de Laravel.
Ahora vamos a modificar la vista hello.php. Primero le cambiaremos la extensión para usar el sistema de plantillas blade, entonces le cambiamos el nombre a hello.blade.php y modificamos el contenido para quede de la siguiente manera:
Código :
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Laravel PHP Framework</title> </head> <body> <div class="welcome"> <h1>Bienvenido {{ Auth::user()->name; }}</h1> <a href="/logout">Cerrar sesión.</a> </div> </body> </html>
Si vamos a nuestro navegador y refrescamos nuestra página nos mostrará algo similar a la siguiente pantalla:

Muy bien, ahora vamos a hacer que el usuario pueda cerrar su sesión, en routes.php ya tenemos definida la ruta /logout:
Código :
Route::get('logout', 'AuthController@logOut');
Falta agregar la función logOut en nuestro controller, así que agregaremos el siguiente código en AuthController.php:
Código :
/** * Muestra el formulario de login mostrando un mensaje de que cerró sesión. */ public function logOut() { Auth::logout(); return Redirect::to('login') ->with('mensaje_error', 'Tu sesión ha sido cerrada.'); }
Y ahora ya podemos hacer uso del link que pusimos en nuestra vista de bienvenida.
Muy bien, ya terminamos. Ya puedes iniciar sesión, restringir tus rutas y cerrar sesión… esperen un momento, dijimos que íbamos a regresar a darle un toque de diseño a nuestro ejemplo así que vamos al paso tres.
Un toque de diseño con Bootstrap
Ahora toca el turno del diseño y qué mejor forma que haciendo el uso de Bootstrap.
Lo agregaremos de la forma más fácil que es descargar los archivos.
Vamos al sitio web de Bootstrap (http://getbootstrap.com/) y le damos clic en Download Bootstrap. Nos descargará un archivo llamado: bootstrap-3.0.3-dist.zip.
Extraemos los archivos, nos deben aparecer los siguientes directorios:

Los copiamos a nuestro proyecto en la carpeta public/
Ahora modificaremos nuestras 2 vistas (login.blade.php y hello.blade.php) para que terminen de la siguiente manera:
login.blade.php
Código :
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Login</title> {{ HTML::style('css/bootstrap.css'); }} </head> <body> <div class="container"> <div class="panel panel-default"> <div class="panel-body"> {{-- Preguntamos si hay algún mensaje de error y si hay lo mostramos --}} @if(Session::has('mensaje_error')) <div class="alert alert-danger">{{ Session::get('mensaje_error') }}</div> @endif {{ Form::open(array('url' => '/login')) }} <legend>Iniciar sesión</legend> <div class="form-group"> {{ Form::label('usuario', 'Nombre de usuario') }} {{ Form::text('username', Input::old('username'), array('class' => 'form-control')); }} </div> <div class="form-group"> {{ Form::label('contraseña', 'Contraseña') }} {{ Form::password('password', array('class' => 'form-control')); }} </div> <div class="checkbox"> <label> Recordar contraseña {{ Form::checkbox('rememberme', true) }} </label> </div> {{ Form::submit('Enviar', array('class' => 'btn btn-primary')) }} {{ Form::close() }} </div> </div> </div> <script src="https://code.jquery.com/jquery.js"></script> {{ HTML::script('js/bootstrap.js'); }} </body> </html>
hello.blade.php
Código :
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Laravel PHP Framework</title> {{ HTML::style('css/bootstrap.css'); }} </head> <body> <div class="container"> <h1>Bienvenido {{ Auth::user()->name; }}</h1> <a href="/logout">Cerrar sesión.</a> </div> <script src="https://code.jquery.com/jquery.js"></script> {{ HTML::script('js/bootstrap.js'); }} </body> </html>
Bueno como lo dije en un principio, sólo es un toque de diseño.
Eso es todo por hoy, como siempre espero que les sea muy útil, si quieren el código completo lo pueden descargar desde github, en la siguiente URL:
https://github.com/gmlo89/login_basico_con_laravel
¿Sabes SQL? ¿No-SQL? Aprende MySQL, PostgreSQL, MongoDB, Redis y más con el Curso Profesional de Bases de Datos que empieza el martes, en vivo.
Por Marcelo el 20 de Enero de 2014
Bien, ya tenemos nuestra base de datos con la tabla users pero ahora necesitamos un usuario inicial, para eso creamos el archivo UsersTableSeeder.php[b]negrita en app/database/seeds/ con el siguiente código:
aqui no es UserTableSeeder.php si la s ? x q segi al pie del tutorial y no sabia donde me daba el error
class UserTableSeeder extends Seeder {
public function run(){
........
'first_name'=> 'Administrator', aqui no es ? solo 'name'
......
));
}
Por Rob el 20 de Enero de 2014
Marcelo-blog :
Bien, ya tenemos nuestra base de datos con la tabla users pero ahora necesitamos un usuario inicial, para eso creamos el archivo UsersTableSeeder.php[b]negrita en app/database/seeds/ con el siguiente código:
aqui no es UserTableSeeder.php si la s ? x q segi al pie del tutorial y no sabia donde me daba el error
class UserTableSeeder extends Seeder {
public function run(){
........
'first_name'=> 'Administrator', aqui no es ? solo 'name'
......
));
}
Gracias Marcelo tienes razón me equivoque en la clase UserTableSeeder es name no first_name y en cuanto a el nombre del archivo, no debería marcarte error ya que lo que agregas es el nombre de la clase no del archivo. Pediré que lo cambien gracias por avisar del error
Me funciona perfecto todo, pero cuando intento determinar si el usuario se autentifico usando "rememberme" con Auth::viaRemember() no logró hacer que funcione, le pase el segundo parametro directamente como "true" para probar por no funciona. Cuando redirigue a la vista tengo esto para comprobarlo y siempre muestra 777
@if (Auth::viaRemember())
{{666}}
@else
{{777}}
@endif
Saludos!
jorgeluisgatica :
Me funciona perfecto todo, pero cuando intento determinar si el usuario se autentifico usando "rememberme" con Auth::viaRemember() no logró hacer que funcione, le pase el segundo parametro directamente como "true" para probar por no funciona. Cuando redirigue a la vista tengo esto para comprobarlo y siempre muestra 777
@if (Auth::viaRemember())
{{666}}
@else
{{777}}
@endif
Saludos!
Tienes razón Jorge, la verdad no me había dado cuenta creo que el problema es con el método viaRemember(), seguire buscando cuando tenga la solución la posteare aquí. Saludos.
Por Alexander el 31 de Enero de 2014
Por Matías el 02 de Febrero de 2014
Por Isaí el 02 de Febrero de 2014
Por jaime el 04 de Marzo de 2014
{{ HTML::style('css/bootstrap.css'); }}
{{-- Preguntamos si hay algún mensaje de error y si hay lo mostramos --}} @if(Session::has('mensaje_error'))
{{ Session::get('mensaje_error') }}
@endif {{ Form::open(array('url' => '/login')) }} Iniciar sesión
{{ Form::label('usuario', 'Nombre de usuario') }} {{ Form::text('username', Input::old('username'), array('class' => 'form-control')); }}
{{ Form::label('contraseña', 'Contraseña') }} {{ Form::password('password', array('class' => 'form-control')); }}
Recordar contraseña {{ Form::checkbox('rememberme', true) }}
{{ Form::submit('Enviar', array('class' => 'btn btn-primary')) }} {{ Form::close() }}
alguien me podria explicar porque??
Por kuvako el 03 de Abril de 2014
Por Emmanuel el 07 de Abril de 2014
Yo en mi BD tengo user_password, y al intentar el login me manda un:
Undefined index: password
=/
Por bcnpmt el 20 de Abril de 2014
Whoops, looks like something went wrong.
a alguien mas le pasaba esto?
Por delzep el 06 de Mayo de 2014
en la base de datos le falta el campo "remember_token" a la tabla "users", este campo debe ser tipo varchar y debe aceptar nulos.
La otra corrección que hice fue en el href del link "Cerrar Sesión" en la vista "hello", ya que me enviaba a "localhost/logout" y esto me devolvía error 404, entonces lo cambié por "{{ action('AuthController@logOut') }}" y le adicioné class="btn btn-primary" para que se viera como un botón
Por Bixo el 09 de Mayo de 2014
Alguna ayuda o comentario .... saludos.
Por oscar cadavid el 20 de Mayo de 2014
saludos y esperando tu respuesta
Por Yfenche el 13 de Junio de 2014
y al que resolvio el problema del logout, Muchas gracias!!!
Por juan antonio el 01 de Julio de 2014
no creo que sea un error de instalación de apache o algo así, porque si creo el proyecto y sin modificarlo entro a localhost/login/ sale el mensaje de "you have arrived" ayuda...
Por leonardo el 14 de Julio de 2014
Por roberto el 23 de Julio de 2014
$table->string('remember_token',100)->nullable();
y sus funciones en el controlador User.php
public function getAuthIdentifier()
{
return $this->getKey();
}
public function getAuthPassword()
{
return $this->password;
}
public function getRememberToken()
{
return $this->remember_token;
}
public function setRememberToken($value)
{
$this->remember_token = $value;
}
public function getRememberTokenName()
{
return "remember_token";
}
public function getReminderEmail()
{
return $this->email;
}
con eso queda arreglado cerrar sesión y el recordar pass
saludos
Por Lumiloro el 04 de Agosto de 2014
todo me salio correcto, pero al final, al momento de poner ...../public/login me bota el error por defecto Whoops, looks like something went wrong....
no se que estaré haciendo mal.
Por Lumiloro el 05 de Agosto de 2014
al momento de ejecutar [ php artisan db:seed ] me sale error...
alguien me podría ayudar con esto.
Por marcinf2 el 07 de Agosto de 2014
a mi me ocurria lo mismo al poner php artisan db:seed me tiraba error proba acomodando los campos en el archivo en migrations/create_users_table que te quede asi
public function up()
{
// Creamos la tabla users con los campos más básicos.
Schema::create('users',function($table){
$table->increments('id');
$table->string('name',100);
$table->string('username',100)->unique();
$table->string('email',100)->unique();
$table->string('password');
$table->timestamps();
});
}
a mi me funciono seguramente debe ser eso resulta que estaban desordenados el campo name debajo del username
Por Diego Llinás el 16 de Agosto de 2014
Por moviuz el 29 de Agosto de 2014
Por moviuz el 29 de Agosto de 2014
Por AdanCruz el 02 de Septiembre de 2014
De todo lo demás excelente aporte Saludos
Por carellot el 03 de Octubre de 2014
Saludos
Por Engels el 10 de Octubre de 2014
Por Paloma el 27 de Octubre de 2014
Por bryan el 31 de Octubre de 2014
http://localhost/system-telefonica/public/logout
y me sale esto
Whoops, looks like something went wrong.
me podrian ayudar
Por xavi9321 el 02 de Noviembre de 2014
Por wilmertri el 02 de Noviembre de 2014
Por JorgePoot el 12 de Noviembre de 2014
Por bryan el 12 de Noviembre de 2014
Por Diego el 22 de Noviembre de 2014
Por JuanKAlvarez el 26 de Noviembre de 2014
Por cveranoa el 17 de Diciembre de 2014
Solución para quienes reportan problemas con el php artisan db:seed
Primero el archivo DatabaseSeeder.php debe contener una clase con el mismo nombre.
Segundo el archivo <nombredetabla>TableSeeder.php debe estar en la carpeta models y no en migrations
Saludos
Por Hosting para Laravel el 20 de Enero de 2015
Hosting para desarrolladores y programadores. Paga solo por lo que necesitas, puedes migrar a un plan mas avanzado en cualquier momento, CMS (Wordpress,Joomla, Drupal...) y Framework (Laravel, Django, ruby on rails). Hosting SSD de alto rendimiento para tus aplicaciones y páginas web que cargan 300% mas rápido!!!
Por membreno el 27 de Marzo de 2015
Por xub el 28 de Marzo de 2015
Por jose10lda el 29 de Junio de 2015
{
throw new QueryException(
$query, $this->prepareBindings($bindings), $e
Por Joaquin el 06 de Diciembre de 2017