# Autenticación

Realizar autenticaciones con Laravel 5.8 es sumamente secillo. Para este ejemplo comenzaremos con un proyecto desde cero.

Documentación oficial Laravel 5.8

laravel new notas_auth

Luego dentro de nuestro proyecto ejecutamos el siguiente comando:

php artisan make:auth

Este comando debe usarse en aplicaciones nuevas e instalará una vista de diseño, registro y vistas de inicio de sesión, así como rutas para todos los puntos finales de autenticación. Un HomeController También se generarán para manejar las solicitudes de acceso a post-login de su aplicación.

Una vez completado el proceso de configuración es momento de configurar nuestra base de datos, este proceso ya lo realizamos, puede obtener más información aquí

# Práctica Notas con Auth

Para comprender mejor como funciona la autenticación en laravel, desarrollaremos el siguiente ejercicio:

Objetivos

Crear una aplicación web donde los usuarios puedan crear y adminitrar notas, cabe señalar que cada usuario tendrá que ver sus propias notas y no las de otros, además de agregar vistas protegidas a la administración.

# Base de datos

Lo primero será crear una base de datos en nuestro PhpMyAdmin y configurar el archivo .env de nuestro proyecto:

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel_auth
DB_USERNAME=root
DB_PASSWORD=

# AppServiceProvider

Configurar el archivo AppServiceProvider.php (app/Provides/AppServiceProvider.php)

use Illuminate\Support\Facades\Schema;

public function boot()
{
    Schema::defaultStringLength(191);
}

# Crear modelo y Migración

php artisan make:model Nota -m
Schema::create('notas', function (Blueprint $table) {
    $table->bigIncrements('id');
    $table->string('nombre');
    $table->text('descripcion');
    $table->text('usuario');
    $table->timestamps();
});

Agregamos un campo usuario para poder luego hacer filtros de notas en el controlador.

# Resource Controllers

Para crear un controlador para nuestro CRUD de notas, podemos utilizar Resource Controllers lo cual generará todas las rutas automáticamente (No es maravillo Laravel 😍)

Documentación oficial

Ejecutamos el siguiente comando:

php artisan make:controller NotaController --resource

Luego configuramos la siguiente ruta:

Route::resource('/notas', 'NotaController');

Aquí una tabla con todas las rutas y acciones configuradas automáticamente:

Verb URI Action Route Name
GET /notas index notas.index
GET /notas/create create notas.create
POST /notas store notas.store
GET /notas/{nota} show notas.show
GET /notas/{nota}/edit edit notas.edit
PUT/PATCH /notas/{nota} update notas.update
DELETE /notas/{nota} destroy notas.destroy

# Proteger rutas

Para que cada ruta antes señalada esté protegida por Auth debemos agregar la siguiente línea de comandos a NotaController

public function __construct()
{
    $this->middleware('auth');
}

Así al momento de montar nuestro controlador se utilizará el middleware auth.

# Leer Notas (index)

Aquí guardaremos en una variable al usuario que esté identificado, además de hacer nuestra consulta a la base de datos y pintar la siguiente vista:

Como utilizaremos el modelo Nota es fundamental agregar lo siguiente al inicio de nuestro controlador:

use App\Nota;

Luego definir la acción index:

public function index()
{
    $usuarioEmail = auth()->user()->email;
    $notas = Nota::where('usuario', $usuarioEmail)->paginate(5);
    return view('notas.lista',compact('notas'));
}

# Vista notas.lista

@extends('layouts.app')

@section('content')
<div class="container">
    <div class="row justify-content-center">
        <div class="col-md-8">
            <div class="card">
                <div class="card-header d-flex justify-content-between align-items-center">
                    <span>Lista de Notas para {{auth()->user()->name}}</span>
                    <a href="/notas/create" class="btn btn-primary btn-sm">Nueva Nota</a>
                </div>

                <div class="card-body">      
                    <table class="table">
                        <thead>
                            <tr>
                            <th scope="col">#</th>
                            <th scope="col">Nombre</th>
                            <th scope="col">Descripción</th>
                            <th scope="col">Acción</th>
                            </tr>
                        </thead>
                        <tbody>
                            @foreach ($notas as $item)
                            <tr>
                                <th scope="row">{{ $item->id }}</th>
                                <td>{{ $item->nombre }}</td>
                                <td>{{ $item->descripcion }}</td>
                                <td>Acción</td>
                            </tr>
                            @endforeach
                        </tbody>
                    </table>
                    {{$notas->links()}}
                {{-- fin card body --}}
                </div>
            </div>
        </div>
    </div>
</div>
@endsection

Estamos reutilizando el layout y secciones que se crearon automáticamente con la autenticación. Además de pintar al usuario autenticado con sus notas en específico.

Hemos creado el botón de crear notas:

<a href="/notas/create" class="btn btn-primary btn-sm">Nueva Nota</a>

# Crear Nota (create/store)

Vamos a utilizar dos funciones de nuestro controlador create y store:

public function create()
{
    return view('notas.crear');
}

Esta solo retornará la vista notas.crear

# Vista notas.crear

@extends('layouts.app')

@section('content')
<div class="container">
    <div class="row justify-content-center">
        <div class="col-md-8">
            <div class="card">
                <div class="card-header d-flex justify-content-between align-items-center">
                    <span>Agregar Nota</span>
                    <a href="/notas" class="btn btn-primary btn-sm">Volver a lista de notas...</a>
                </div>
                <div class="card-body">     
                  @if ( session('mensaje') )
                    <div class="alert alert-success">{{ session('mensaje') }}</div>
                  @endif
                  <form method="POST" action="/notas">
                    @csrf
                    <input
                      type="text"
                      name="nombre"
                      placeholder="Nombre"
                      class="form-control mb-2"
                    />
                    <input
                      type="text"
                      name="descripcion"
                      placeholder="Descripcion"
                      class="form-control mb-2"
                    />
                    <button class="btn btn-primary btn-block" type="submit">Agregar</button>
                  </form>
                </div>
            </div>
        </div>
    </div>
</div>
@endsection

Y en nuestro controlador:

public function store(Request $request)
{

    $nota = new Nota();
    $nota->nombre = $request->nombre;
    $nota->descripcion = $request->descripcion;
    $nota->usuario = auth()->user()->email;
    $nota->save();

    return back()->with('mensaje', 'Nota Agregada!');
}

La única diferencia con nuestro proyecto anterior es que utilizamos la columna usuario para filtrar las notas para cada cliente. Por lo tanto queda como tarea resolver las siguientes acciones del CRUD.