OpenWebinars

Frameworks

Diferencias entre Autenticación y Autorización

En ocasiones se confunden los conceptos de autenticación y de autorización, y surgen preguntas como ¿son lo mismo?, ¿en qué se diferencian? o ¿para qué sirven? En este artículo vamos a dar respuesta a esas preguntas para que puedas resolver tus dudas.

Luis Miguel López Magaña

Luis Miguel López Magaña

Experto en Java

Lectura 4 minutos

Publicado el 17 de enero de 2020

Compartir

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;

}

<p>

Conviértete en un Backend Developer
Domina los lenguajes de programación más demandados. Accede a cursos, talleres y laboratorios para crear proyectos con Java, Python, PHP, Microsoft .NET y más
Comenzar gratis ahora
</p>

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.

Mejora las habilidades de tus desarrolladores
Acelera la formación tecnológica de tus equipos con OpenWebinars. Desarrolla tu estrategia de atracción, fidelización y crecimiento de tus profesionales con el menor esfuerzo.
Solicitar más información

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.

Compartir este post

También te puede interesar

Qué es OAuth 2
Blog

Qué es OAuth 2

Te contamos qué es y en qué consiste el protocolo OAuth2 utilizado por APIs, además de qué ventajas aporta y cuál es...

Luis Miguel López Magaña