1 of 37

Autenticación y Autorización

Programación Web II - TUPAR - UNICEN

2 of 37

Autenticación

La autenticación es el acto o proceso de confirmar que algo (o alguien) es quien dice ser

3 of 37

Autorización

Proceso por el cual se autoriza al usuario (ya identificado) a acceder a determinados recursos de la misma

4 of 37

Autenticación en Laravel

5 of 37

Configuración

  • Esta en el archivo config/auth.php
  • Tenemos varias configuraciones:
    • Guards
      • Como cada usuario es autenticado para cada request.
        • Por ejemplo: session, mantiene el estado usando una sesión como usábamos con PHP puro.
    • Providers
      • Cómo obtenemos los usuarios del lugar que los tenemos almacenados
        • Por ejemplo: usando Eloquent y usando un modelo.
    • Reset Password

6 of 37

Usuarios

  • Por defecto se crea una tabla users
  • Tenemos un modelo App\User para usarla
  • Se encarga de manejar la encriptación de passwords
  • De mantener un token si queremos que se nos recuerde

7 of 37

Laravel Default

  • Por defecto Laravel trae algunos Controllers:
    • ForgotPasswordController
    • LoginController
    • RegisterController
    • ResetPasswordController
  • Si tenemos que hacer algo específico podemos modificarlos
    • Ejemplo: Cuando nos logueamos cargar algun dato extra en la sesión.
  • En general quedan como están

8 of 37

Manos a la obra

  • Laravel lo hace sencillo
  • Usando un comando artisan podemos configurar la autenticación en nuestro sitio

php artisan make:auth

  • Esto nos crea:
    • Layout
    • La vista de registración y de login en views/auth

9 of 37

Problema #1

Nuestra cliente quiere que la App de Tareas, ahora solo puedan usarla usuarios registrados en nuestro sitio

10 of 37

Paréntesis de estilos

11 of 37

Miremos el Layout

  • Incluye el nombre de la app desde la configuración
  • Un css que está en la carpeta assets/css/app.css

12 of 37

Laravel CSS

  • Laravel usa SASS - Syntactically Awesome Style Sheets
  • Es un lenguaje que nos permite escribir CSS con algunas cosas extras
  • El archivo lo podemos ver en resources/assets/sass/app.scss

13 of 37

Build Sass

  • Para poder hacer un build de Sass tenemos que ejecutar:

npm install

  • Esto nos va a traer algunas dependencias nuevas, que tiene que ver con Javascript y CSS
  • Para hacer el build ejecutamos

npm run dev

14 of 37

Cómo proteger una ruta?

15 of 37

Middleware

  • Hay un montón de “Wrappers” alrededor de los requests en Laravel
  • Algunos de esos, son llamados “Middlewares”
  • Cuando el closure termina, aún no es tiempo de mandar el contenido al browser
  • Devolver el contenido nos ayuda a continuar con el flujo por todos esos wrappers antes de mandarlo de nuevo al usuario

Print

HTML

URL Request

Return “Hello”

AUTH

16 of 37

Protegiendo Rutas

  • Laravel tiene el middleware auth que nos permite autenticar rutas
  • Podemos hacerlo de 2 formas:
    • En el Controller que queremos autenticar

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

    • En la ruta misma. (No funciona con Route::resouces)

Route::get('profile', function () {// Only authenticated users may enter...�})->middleware('auth');

17 of 37

Problema #2

Nuestro cliente quiere que la App de Tareas, ahora tenga tareas por usuario

Es decir que cuando el usuario accede vea solo sus tareas

18 of 37

Qué hacemos?

  • Agregar a cada tarea el usuario que la creo.
    • Hacer la realcion usuario tarea
    • Hacer una migracion para agregar la coliumna user_id en tareas
  • Arreglar los seeders para que tenga usuario.
  • View Index que muestre las tareas del usuario logueado.
  • View Crear tarea pasarle el usuario.

19 of 37

Problema #3

Nuestro cliente está muy contento con la funcionalidad de tareas por usuarios y ahora quiere que un usuario pueda crear tareas para otro usuario

20 of 37

Qué hacemos?

TBC

21 of 37

Problema #4

Nuestro cliente quiere restringir el acceso a la asignación de tareas solo a los usuarios que son manager

22 of 37

Autorización en Laravel

23 of 37

Introducción

  • Laravel provee 2 formas para implementar la autorización:
    • Gates
      • No proveen una forma simple de autorizar dentro de un closure
      • En su definición, son parecidas a las Routes
    • Policies
      • Sirven para agrupar la autorización para un modelo o recurso especifico

24 of 37

Gates - Closures

  • Son closures que se usan para determinar si un usuario tiene permisos para hacer alguna acción.
  • Se definen generalmente en App\Providers\AuthServiceProvider
  • Siempre reciben como parámetro un Usuario y pueden recibir una instancia de un Modelo.

public function boot(){� $this->registerPolicies();�� Gate::define('update-post', function ($user, $post) {return $user->id == $post->user_id;});}

25 of 37

Gates - Métodos

  • También pueden recibir un método de una clase en lugar de un closure (como lo hacemos en Routes)

Gate::define('update-post', 'PostPolicy@update');

  • Al igual que en Routes, podemos definir gates para todas las acciones REST usando

Gate::resource('posts', 'PostPolicy');

  • es lo mismo que

Gate::define('posts.view', 'PostPolicy@view');Gate::define('posts.create', 'PostPolicy@create');

….

26 of 37

Gates - Autorización

  • Usamos los metodos allows y denies
  • Laravel automáticamente pasa el usuario actual

if (Gate::allows('update-post', $post)) {// El usuario actual puede actualizar el post.�}��if (Gate::denies('update-post', $post)) {// El usuario actual no puede actualizar el post.�}

  • Si queremos preguntar por un usuario particular

if (Gate::forUser($user)->allows('update-post', $post)) {// El usuario puede actualizar el post.�}

27 of 37

Policy - Creación

  • Son clases que organizan la logica de autorización de los modelos
  • Se pueden generar usando artisan

php artisan make:policy TaskPolicy --model=Task

  • Genera una Policy, con los metodos basicos de CRUD

28 of 37

Policy - Registración

  • Para poder usarla hay que registrarla
  • En el archivo AuthServiceProvider tenemos un mapeo de las clases de los Modelos con las Policies

Ejemplo:

protected $policies = [Task::class => TaskPolicy::class,];

29 of 37

Policy - Definición

  • Dentro de los métodos tenemos que definir la lógica para autorizar

Ejemplo:

public function update(User $user, Task $task){return $user->id === $task->user_id;}

  • Solo puede actualizar una Tarea el usuario que la creo

30 of 37

Policy - Sin Modelo

  • Puede pasar que no necesitemos el modelo para validar una Policy.
  • Ejemplo
    • Un usuario puede crear una tarea
      • No necesitamos el modelo porque aún no existe
  • Simplemente no le pasamos el modelo

public function create(User $user){//�}

31 of 37

Policy - Filtros

  • Puede pasar que no necesitemos validar si puede hacer algo o no por el tipo de usuario
  • Ejemplo: Es un super usuario que tiene permiso para todo
  • Creamos un método before, que se ejecuta antes que cada policy

public function before($user, $ability){if ($user->isSuperAdmin()) {return true;}}

32 of 37

Policies - Usando modelos

  • Laravel sabe qué policy usar en el contexto que estamos
    • Siempre que tengamos una policy registrada para ese Modelo
  • En el caso de pasar la instancia de un Modelo:

if ($user->can('update', $task)) {//�}

  • Queremos usar una policy en particular, que no recibe instancia

if ($user->can('create', Task::class)) {// Ejecuta el método "create" de la policy correspondiente�}

33 of 37

Policies - Usando Middlewares

  • En el caso de requerir un modelo

Route::put('/task/{task}', function (Task $task) {// El usuario actual puede actualizar la tarea�})->middleware('can:update,task);

  • Cuando no requiere un modelo

Route::post('/task, function () {// EL usuario actual puede crear tareas.�})->middleware('can:create,App\Task);

34 of 37

Policies - Dentro del Controller

  • En el caso de requerir un modelo

public function update(Request $request, Task $task){� $this->authorize('update', $task);�� // El usuario actual puede actualizar la tarea.� }

  • Cuando no requiere un modelo

public function create(Request $request){� $this->authorize('create', Task::class);�� // El usuario actual puede crear una tarea.�}

35 of 37

Policies - Blade Templates

  • En el caso de requerir un modelo

@can('update', $task)<!-- El usuario actual puede actualizar la tarea -->�@elsecan('delete', $task)<!-- El usuario actual puede borrar la tarea -->�@endcan��@cannot('update', $task)<!-- El usuario actual no puede actualizar la tarea -->�@elsecannot('delete', $task)<!-- El usuario actual no puede borrar la tarea -->�@endcannot

36 of 37

Policies - Blade Templates

  • Cuando no requiere un modelo

@can('create', App\Task::class)<!-- El usuario actual puede crear Posts -->�@endcan��@cannot('create', App\Task::class)<!-- El usuario actual no puede crear Posts -->�@endcannot

37 of 37

Referencias