Spanish (Español) translation by Steven (you can also view the original English article)
La autenticación es parte de casi todas las aplicaciones web con las que trabajas. Es realmente aburrido seguir repitiendo todo el código estándar en cada proyecto. Bueno, la buena noticia es que Laravel 5 te libera de este aburrimiento al proporcionar una fachada de autenticación que ya está lista para ser usada.
Todo lo que necesitas hacer es configurar y personalizar el proveedor de servicios de autenticación según las necesidades de tu proyecto. En este consejo rápido, te mostraré exactamente cómo hacerlo.
¿Estás buscando un atajo?
Si deseas una solución probada y lista para usar, prueba Vanguard - Advanced PHP Login and User Management en Envato Market. Es una aplicación PHP, escrita en Laravel 5.2, que permite a los propietarios de sitios web agregar y habilitar rápidamente la autenticación, autorización y administración de usuarios en sus sitios web.



Configurar el entorno
Asumiré que estás comenzando con una nueva instalación de Laravel 5, pero puedes omitir cualquiera de estos pasos si ya los has realizado. En primer lugar, debes establecer algunas variables de entorno en el archivo .env
en la raíz de tu proyecto. Básicamente, estos tienen que ver con la configuración de la base de datos.
1 |
APP_ENV=local |
2 |
APP_DEBUG=true |
3 |
APP_KEY=8wfDvMTvfXWHuYE483uXF11fvX8Qi8gC |
4 |
|
5 |
DB_HOST=localhost |
6 |
DB_DATABASE=laravel_5_authentication |
7 |
DB_USERNAME=root |
8 |
DB_PASSWORD=root |
9 |
|
10 |
CACHE_DRIVER=file |
11 |
SESSION_DRIVER=file |
Ten en cuenta las variables APP_ENV
, DB_HOST
, DB_DATABASE
, DB_USERNAME
y DB_PASSWORD
. La variable APP_ENV
le dice a Laravel en qué entorno deseamos ejecutar nuestra aplicación web. El resto de los nombres de las variables de la base de datos son bastante obvios.
Esto es todo lo que necesitas hacer para configurar la conexión de la base de datos. Pero, ¿cómo utiliza Laravel estas variables? Examinemos el archivo config/database.php
. Notarás el uso de la función env()
. Por ejemplo, env('DB_HOST', 'localhost')
. Laravel 5 usa esta función para capturar variables de las matrices globales $_ENV
y $_SERVER
, que se completan automáticamente con las variables que tú defines en el archivo .env
.
Configurar las migraciones
Ejecuta php artisan migrate: install --env=local
en tu terminal en la raíz de tu proyecto para instalar las migraciones localmente. También observa que hay dos migraciones ya definidas en la carpeta database/migrations
. Usando estas migraciones, Laravel 5 crea una tabla users
y password_resets
, lo que permite que funcione la plantilla de autenticación predeterminada. Voy a crear una tercera migración para modificar la tabla users
solo para mostrarte cómo personalizar la configuración de autenticación predeterminada.
Ejecuta php artisan make:migration alter_users_table_remove_name_add_first_name_last_name
en la terminal para crear una tercera migración.
1 |
<?php
|
2 |
|
3 |
use Illuminate\Database\Schema\Blueprint; |
4 |
use Illuminate\Database\Migrations\Migration; |
5 |
|
6 |
class AlterUsersTableRemoveNameAddFirstNameLastName extends Migration { |
7 |
|
8 |
/**
|
9 |
* Run the migrations.
|
10 |
*
|
11 |
* @return void
|
12 |
*/
|
13 |
public function up() |
14 |
{
|
15 |
Schema::table('users', function($table){ |
16 |
$table->dropColumn('name'); |
17 |
$table->string('first_name', 50)->after('id'); |
18 |
$table->string('last_name', 50)->after('first_name'); |
19 |
});
|
20 |
}
|
21 |
|
22 |
/**
|
23 |
* Reverse the migrations.
|
24 |
*
|
25 |
* @return void
|
26 |
*/
|
27 |
public function down() |
28 |
{
|
29 |
Schema::table('users', function($table){ |
30 |
$table->dropColumn('last_name'); |
31 |
$table->dropColumn('first_name'); |
32 |
$table->string('name')->after('id'); |
33 |
});
|
34 |
}
|
35 |
|
36 |
}
|
Como puedes ver, eliminaste el campo del nombre y agregaste dos campos más para el nombre y apellido (first_name
y last_name
respectivamente) con una longitud máxima de 50 caracteres. También has agregado el código que revierte estos cambios en la base de datos.
Ejecuta php artisan migrate
en la terminal. Si las migraciones se ejecutaron correctamente, deberías poder ver las dos tablas en tu base de datos con los campos que definiste.
Configuración del servicio de registro
Vas a configurar el servicio "Registrar" para agregar los campos de la tabla users
recién definidos.
Edita el archivo app/Services/Registrar.php
.
1 |
<?php namespace App\Services; |
2 |
|
3 |
use App\User; |
4 |
use Validator; |
5 |
use Illuminate\Contracts\Auth\Registrar as RegistrarContract; |
6 |
|
7 |
class Registrar implements RegistrarContract { |
8 |
|
9 |
/**
|
10 |
* Get a validator for an incoming registration request.
|
11 |
*
|
12 |
* @param array $data
|
13 |
* @return \Illuminate\Contracts\Validation\Validator
|
14 |
*/
|
15 |
public function validator(array $data) |
16 |
{
|
17 |
return Validator::make($data, [ |
18 |
'first_name' => 'required|min:3|max:50', |
19 |
'last_name' => 'required|min:3|max:50', |
20 |
'email' => 'required|email|max:255|unique:users', |
21 |
'password' => 'required|confirmed|min:6', |
22 |
]);
|
23 |
}
|
24 |
|
25 |
/**
|
26 |
* Create a new user instance after a valid registration.
|
27 |
*
|
28 |
* @param array $data
|
29 |
* @return User
|
30 |
*/
|
31 |
public function create(array $data) |
32 |
{
|
33 |
return User::create([ |
34 |
'first_name' => $data['first_name'], |
35 |
'last_name' => $data['last_name'], |
36 |
'email' => $data['email'], |
37 |
'password' => bcrypt($data['password']), |
38 |
]);
|
39 |
}
|
40 |
|
41 |
}
|
La función validator
valida los datos transmitidos desde el formulario de registro del usuario. Has eliminado el campo name
predeterminado y has agregado los campos first_name
y last_name
con una longitud mínima de tres caracteres y una longitud máxima de 50 caracteres para ambos. La función create
agrega el usuario registrado a la tabla users
en la base de datos, por lo que solo necesitas incluir los campos first_name
y last_name
.
Actualización del modelo User
También deberás actualizar el modelo User para incluir los campos first_name
y last_name
.
Edita el archivo app/User.php
.
1 |
<?php namespace App; |
2 |
|
3 |
use Illuminate\Auth\Authenticatable; |
4 |
use Illuminate\Database\Eloquent\Model; |
5 |
use Illuminate\Auth\Passwords\CanResetPassword; |
6 |
use Illuminate\Contracts\Auth\Authenticatable as AuthenticatableContract; |
7 |
use Illuminate\Contracts\Auth\CanResetPassword as CanResetPasswordContract; |
8 |
|
9 |
class User extends Model implements AuthenticatableContract, CanResetPasswordContract { |
10 |
|
11 |
use Authenticatable, CanResetPassword; |
12 |
|
13 |
/**
|
14 |
* The database table used by the model.
|
15 |
*
|
16 |
* @var string
|
17 |
*/
|
18 |
protected $table = 'users'; |
19 |
|
20 |
/**
|
21 |
* The attributes that are mass assignable.
|
22 |
*
|
23 |
* @var array
|
24 |
*/
|
25 |
protected $fillable = ['first_name', 'last_name', 'email', 'password']; |
26 |
|
27 |
/**
|
28 |
* The attributes excluded from the model's JSON form.
|
29 |
*
|
30 |
* @var array
|
31 |
*/
|
32 |
protected $hidden = ['password', 'remember_token']; |
33 |
|
34 |
}
|
La matriz $fillable
especifica qué campos del modelo están abiertos a modificaciones. Por lo general, no vas a incluir campos que se generan automáticamente en esta matriz o campos que no requieren la entrada de un usuario, como el hash para un token de recordar los datos de usuario. Todo lo que has hecho es actualizar la matriz $fillable
para permitir que el nombre y apellido (first_name
y last_name
) sean asignables masivamente.
Actualizar la vista
Finalmente, solo necesitas actualizar las vistas del front-end para incluir los campos first_name
y last_name
. Primero, actualicemos el formulario de registro.
Edita el archivo resources/views/auth/register.blade.php
.
1 |
@extends('app') |
2 |
|
3 |
@section('content') |
4 |
|
5 |
<div class="container-fluid"> |
6 |
<div class="row"> |
7 |
<div class="col-md-8 col-md-offset-2"> |
8 |
<div class="panel panel-default"> |
9 |
<div class="panel-heading">Register</div> |
10 |
<div class="panel-body"> |
11 |
@if (count($errors) > 0) |
12 |
<div class="alert alert-danger"> |
13 |
<strong>Whoops!</strong> There were some problems with your input.<br><br> |
14 |
<ul>
|
15 |
@foreach ($errors->all() as $error) |
16 |
<li>{{ $error }}</li> |
17 |
@endforeach |
18 |
</ul>
|
19 |
</div>
|
20 |
@endif |
21 |
|
22 |
<form class="form-horizontal" role="form" method="POST" action="/auth/register"> |
23 |
<input type="hidden" name="_token" value="{{ csrf_token() }}"> |
24 |
|
25 |
<div class="form-group"> |
26 |
<label class="col-md-4 control-label">First Name</label> |
27 |
<div class="col-md-6"> |
28 |
<input type="text" class="form-control" name="first_name" value="{{ old('first_name') }}"> |
29 |
</div>
|
30 |
</div>
|
31 |
|
32 |
<div class="form-group"> |
33 |
<label class="col-md-4 control-label">Last Name</label> |
34 |
<div class="col-md-6"> |
35 |
<input type="text" class="form-control" name="last_name" value="{{ old('last_name') }}"> |
36 |
</div>
|
37 |
</div>
|
38 |
|
39 |
<div class="form-group"> |
40 |
<label class="col-md-4 control-label">E-Mail Address</label> |
41 |
<div class="col-md-6"> |
42 |
<input type="email" class="form-control" name="email" value="{{ old('email') }}"> |
43 |
</div>
|
44 |
</div>
|
45 |
|
46 |
<div class="form-group"> |
47 |
<label class="col-md-4 control-label">Password</label> |
48 |
<div class="col-md-6"> |
49 |
<input type="password" class="form-control" name="password"> |
50 |
</div>
|
51 |
</div>
|
52 |
|
53 |
<div class="form-group"> |
54 |
<label class="col-md-4 control-label">Confirm Password</label> |
55 |
<div class="col-md-6"> |
56 |
<input type="password" class="form-control" name="password_confirmation"> |
57 |
</div>
|
58 |
</div>
|
59 |
|
60 |
<div class="form-group"> |
61 |
<div class="col-md-6 col-md-offset-4"> |
62 |
<button type="submit" class="btn btn-primary"> |
63 |
Register |
64 |
</button>
|
65 |
</div>
|
66 |
</div>
|
67 |
</form>
|
68 |
</div>
|
69 |
</div>
|
70 |
</div>
|
71 |
</div>
|
72 |
</div>
|
73 |
|
74 |
@endsection |
Has agregado los campos first_name
y last_name
al formulario de registro. También debes editar el diseño predeterminado de la aplicación en resources/views/app.blade.php
para mostrar el nombre del usuario que inició sesión en el menú de navegación.
1 |
<!DOCTYPE html>
|
2 |
<html lang="en"> |
3 |
<head>
|
4 |
<meta charset="utf-8"> |
5 |
<meta http-equiv="X-UA-Compatible" content="IE=edge"> |
6 |
<meta name="viewport" content="width=device-width, initial-scale=1"> |
7 |
<title>Laravel 5: Using The Authentication Facade</title> |
8 |
|
9 |
<link href="/css/bootstrap.min.css" rel="stylesheet"> |
10 |
<link href="/css/bootstrap-theme.min.css" rel="stylesheet"> |
11 |
<link href="/css/app.css" rel="stylesheet"> |
12 |
|
13 |
<!-- Fonts -->
|
14 |
<!--<link href='//fonts.googleapis.com/css?family=Roboto:400,300' rel='stylesheet' type='text/css'>-->
|
15 |
|
16 |
<!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
|
17 |
<!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
|
18 |
<!--[if lt IE 9]>
|
19 |
<script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
|
20 |
<script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
|
21 |
<![endif]-->
|
22 |
</head>
|
23 |
<body>
|
24 |
<nav class="navbar navbar-default"> |
25 |
<div class="container-fluid"> |
26 |
<div class="navbar-header"> |
27 |
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1"> |
28 |
<span class="sr-only">Toggle Navigation</span> |
29 |
<span class="icon-bar"></span> |
30 |
<span class="icon-bar"></span> |
31 |
<span class="icon-bar"></span> |
32 |
</button>
|
33 |
<a class="navbar-brand" href="#">Laravel</a> |
34 |
</div>
|
35 |
|
36 |
<div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1"> |
37 |
<ul class="nav navbar-nav"> |
38 |
<li><a href="/">Home</a></li> |
39 |
</ul>
|
40 |
|
41 |
<ul class="nav navbar-nav navbar-right"> |
42 |
@if (Auth::guest()) |
43 |
<li><a href="/auth/login">Login</a></li> |
44 |
<li><a href="/auth/register">Register</a></li> |
45 |
@else |
46 |
<li class="dropdown"> |
47 |
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-expanded="false">{{ Auth::user()->first_name . ' ' . Auth::user()->last_name }} <span class="caret"></span></a> |
48 |
<ul class="dropdown-menu" role="menu"> |
49 |
<li><a href="/auth/logout">Logout</a></li> |
50 |
</ul>
|
51 |
</li>
|
52 |
@endif |
53 |
</ul>
|
54 |
</div>
|
55 |
</div>
|
56 |
</nav>
|
57 |
|
58 |
<div class="container"> |
59 |
@yield('content') |
60 |
</div>
|
61 |
|
62 |
<!-- Scripts -->
|
63 |
<script src="//cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script> |
64 |
<script src="//cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.1/js/bootstrap.min.js"></script> |
65 |
</body>
|
66 |
</html>
|
Agregando seguridad a tus rutas
Para proteger tus rutas y permitir que solo los usuarios que hayan iniciado sesión puedan acceder a ellas, debes hacer uso del middleware de autenticación que proporciona Laravel. El middleware de autenticación se puede encontrar en app\Http\Middleware\Authenticate.php
.
A continuación, se muestran algunos ejemplos de cómo utilizarlo para proteger tus rutas.
1 |
// route closure
|
2 |
Route::get('<your-route-uri>', ['middleware' => 'auth', function() |
3 |
{
|
4 |
// if user is not logged in
|
5 |
// he/she will be redirected to the login page
|
6 |
// and this code will not be executed
|
7 |
}]);
|
8 |
|
9 |
// controller action
|
10 |
Route::get('<your-route-uri>', ['middleware' => 'auth', 'uses' => '<your-controller>@<your-action>']); |
11 |
|
12 |
// within a controller
|
13 |
class YourController extends Controller { |
14 |
|
15 |
public function __construct() |
16 |
{
|
17 |
$this->middleware('<your-middleware-name>'); |
18 |
|
19 |
$this->middleware('<another-middleware>', ['only' => ['<some-action-name>']]); |
20 |
|
21 |
$this->middleware('<more-middleware>', ['except' => ['<another-action-name>']]); |
22 |
}
|
23 |
|
24 |
}
|
Modificando las rutas de autenticación predeterminadas
Puedes ejecutar php artisan route:list
en la terminal para verificar las rutas predeterminadas que usa la fachada de autenticación. También puedes acceder a estas rutas para probar tu código de autenticación. A continuación, se muestran algunos ejemplos de cómo modificar estas rutas.
Edita el archivo app/Http/routes.php
.
1 |
// Example 1
|
2 |
// login url https://www.example.com/account/login
|
3 |
// logout url http://www.example.com/account/logout
|
4 |
// registration url http://www.example.com/account/register
|
5 |
Route::controllers([ |
6 |
'account' => 'Auth\AuthController', |
7 |
'password' => 'Auth\PasswordController', |
8 |
]);
|
9 |
|
10 |
// Example 2
|
11 |
// login url http://www.example.com/login
|
12 |
// logout url http://www.example.com/logout
|
13 |
// registration url http://www.example.com/register
|
14 |
Route::controllers([ |
15 |
'' => 'Auth\AuthController', |
16 |
'password' => 'Auth\PasswordController', |
17 |
]);
|
18 |
|
19 |
// Example 3
|
20 |
// redefine all routes
|
21 |
Route::get('example/register', 'Auth\AuthController@getRegister'); |
22 |
Route::post('example/register', 'Auth\AuthController@postRegister'); |
23 |
Route::get('example/login', 'Auth\AuthController@getLogin'); |
24 |
Route::post('example/login', 'Auth\AuthController@postLogin'); |
25 |
Route::get('example/logout', 'Auth\AuthController@getLogout'); |
26 |
Route::get('example/email', 'Auth\PasswordController@getEmail'); |
27 |
Route::post('example/email', 'Auth\PasswordController@postEmail'); |
28 |
Route::get('example/reset/{code}', 'Auth\PasswordController@getReset'); |
29 |
Route::post('example/reset', 'Auth\PasswordController@postReset'); |
Además, recuerda llamar a los URI dinámicamente en tus vistas y plantillas de correo electrónico utilizando los métodos de ayuda de Laravel. Puedes ver cómo hacerlo en el repositorio de GitHub de este consejo rápido.
Notas finales
La función de restablecimiento de contraseña envía el enlace de restablecimiento de contraseña al correo electrónico del usuario, así que asegúrate de que en tu proyecto de Laravel tengas la configuración del correo electrónico del cual vas a enviar estos mensajes. La plantilla de vista para el correo electrónico de restablecimiento de contraseña se encuentra en resources/views/emails/password.blade.php
. También puedes configurar algunas otras opciones básicas en el archivo config/auth.php
.
Espero que este consejo rápido te haya resultado fácil de seguir. Hasta mi próxima pieza de Tuts+, ¡feliz codificación!
Por cierto, si necesitas ayuda adicional para corregir errores o hacer personalizaciones con las que no te sientas cómodo, comunícate con uno de los proveedores de servicios PHP en Envato Studio. Pueden ayudarte con una amplia gama de problemas de manera rápida y confiable, de modo que con una pequeña inversión de dinero, ¡puedes ahorrar mucho tiempo!


