Mautic Pixel

Las cookies nos permiten ofrecer nuestros servicios. Al utilizar nuestros servicios, aceptas el uso que hacemos de las cookies. Más Información. Aceptar

Diferencias entre Autenticación y Autorización: Seguridad en una API Rest

Luis Miguel López Magaña
  • Escrito por Luis Miguel López Magaña el 17 de Enero de 2020
  • 4 min de lectura Frameworks
Diferencias entre Autenticación y Autorización: Seguridad en una API Rest

Autenticación y autorización

La seguridad de una aplicación se suele reducir a dos procesos o dos problemas más o menos independientes:

  • Autenticación: proceso en el que respondemos a la pregunta ¿quién es usted?

  • Autorización, o también conocido a veces como control de acceso: proceso en el que respondemos a la pregunta ¿qué se le permite hacer a usted?

Qué es la autenticación

La autenticación en Spring Security la podemos implementar mediante la interfaz AuthenticationManager, que implementa el patrón estrategia.

Este patrón de estrategia es un patrón de comportamiento que determina cómo se hará el intercambio de mensajes entre diferentes objetos para resolver una tarea, en este caso la autenticación.

Los objetos que al final participen en esta autenticación, deberán implementar esta interfaz, que eminentemente tiene un solo método (authenticate), que recibe un objeto de otro tipo de una interfaz (authentication).

public interface AuthenticationManager {

Authentication authenticate(Authentication authentication)
    Throws AuthenticationException;

}

AuthenticationManager

Un AuthenticationManager puede hacer tres cosas con su único método:

  • Devolver el objeto Authentication que ha recibido, pero con algunos datos más, entre ellos el atributo authenticated=true.

  • Lanzar una excepción de tipo AuthenticationException, excepción que se suele delegar en el tratamiento que le dé la aplicación, y a partir de otro tipo de clase le podíamos dar el tratamiento correspondiente, ya que no es lo mismo trabajar desde una API REST, dónde posiblemente se quiera devolver una error 401 o 403, o desde una aplicación web con interfaz de usuario, como por ejemplo podría ser una aplicación de Spring con Thymeleaf, dónde se quiera renderizar una página en particular que indique que la autenticación ha fallado.

  • No saber cómo dirimir la cuestión de la autenticación y devolver null.

De ese interfaz AuthenticationManager, la implementación más usada es ProviderManager, el cual, dentro de la cantidad de objetos que participan en este proceso, delega en una cadena de instancias de tipo AuthenticationProvider.

Un AuthenticationProvider se parece mucho a un AuthenticationManager, ya que en realidad tiene el mismo método y además añade uno nuevo, el cual verifica si objeto es capaz de realizar el proceso de autenticación basado en el tipo de Authentication que reciba.

Un ProviderManager puede soportar diferentes mecanismos de autenticación en una sola aplicación. Por ejemplo, una aplicación que tenga una parte con interfaz de usuario y una parte REST, dónde se tenga un formulario de usuario y contraseña en la parte en la parte web, y tener implementada la seguridad con OAuth 2.0 y el flujo de código de autorización para la parte REST, y tener totalmente separados los dos mecanismos.

Además, podemos tener en este proceso de autenticación una jerarquía, en la que un ProviderManager tenga un padre, que pueda comprobar que todos un provider hayan devuelto null. En esa cadena podríamos ir ascendiendo de un padre al siguiente, con lo cual, si al final al llegar al padre encontramos que la respuesta en nula, que se transforme en una excepción.

AuthenticationManagerBuilder

A la hora de implementar esta autenticación, Spring Security nos ofrece algunos mecanismos rápidos y muy ligeros, siendo el más comúnmente utilizado el AuthenticationManagerBuilder, que nos permite
construir rápidamente un manager de autenticación de diferentes tipos:

  • Autenticación en memoria, donde tendríamos un conjunto cerrado de usuarios que utilizar.

  • Autenticación basada en JDBC, donde tendríamos que tener un esquema de base de datos predeterminado al cual consultar.

  • Autenticación en base a LDAP, donde podríamos acceder a un servidor que implementara este protocolo para acceder, como por ejemplo podría ser un directorio activo de Windows.

  • Un servicio customizado, que implementará la interfaz UserDetailsServices y en el que diéramos los mecanismos para localizar a los usuarios.

Qué es la autorización o control de acceso

Si la autenticación ha sido exitosa, tenemos que plantearnos qué puede hacer ese usuario, y lo hacemos a través de una interfaz llamada AccessDecisionManager.

Existen tres implementaciones de esta interfaz, y todas delegan en una cadena de objetos de tipo AccessDecisionVoter, al igual que pasaba también con la autenticación.

Un AccessDecisionVoter considera el objeto de tipo Authentication que ya se ha autenticado y un objeto seguro, un recurso, donde va a ponderar si ese Authentication puede o no puede acceder a ese recurso, y es decorado a través de una colección de ConfigAttributes.

Esos atributos de configuración que decoran el objeto son los que determinan el nivel de permisos, y se pueden establecer de diferentes maneras, a través de una configuración programática o a través de anotaciones que utilicen Spring Expression Language (SpEL).

En ocasiones será tan sencillo como establecer el nombre de un rol y ver si ese usuario tiene o no ese rol, y al requerir que para acceder a ese recurso se tenga ese rol, se puede verificar si se tiene o no se tiene el permiso suficiente para poder hacerlo.

Configuración de la autorización

La configuración de la autorización se suele hacer a través de diferentes mecanismos.

Uno de ellos es a través de las anotaciones @PreAuthorize y @PostAuthorize, que se hacen antes de ejecutar un método de controlador o al terminar de ejecutarlo y antes de devolver la respuesta.

También lo podremos hacer extendiendo la clase WebSecurityConfigurerAdapter y el uso de AntMatchers o patrones de ruta, eligiendo qué se permite y que no.

Relacionado

Te dejamos una selección de cursos, carreras y artículos

Programador Java Web

Programador Java Web

carrera

Incluye 7 cursos:

  • Curso Online de Hibernate y JPA
  • Curso JavaServer Faces
  • Java 8 para programadores Java

y 4 cursos más!

Duración: 35 horas y 33 minutos

Qué es OAuth 2

Qué es OAuth 2

Desarrollo Web

17 de Enero de 2020

Seguramente hayas oído hablar de OAuth2 al tratar temas relacionados con la seguridad. Te contamos en qué consiste este protocolo estándar utilizado por APIs, qué ventajas aporta y cuál es su flujo...

Curso de seguridad en tu API REST con Spring Boot

Curso de seguridad en tu API REST con Spring Boot

curso

Con este curso aprenderás:

  • Conocerás los elementos necesarios de Spring Security para tu API REST
  • Aprenderás en qué consiste la autenticación y la autorización.
  • Conocerás las diferentes posibilidades de implementación de la seguridad.

Duración: 5 horas y 39 minutos

Más de 300 empresas confían en nosotros

Oesia
Vass
Everis
Ayesa
Altran
Ibermatica
Atmira
GFI
Accenture
GMV
Concatel
Telefonica
Caser
Banco de España
kpmg
Mapfre
Randstad