Http Basic Authentication (Java)

 ¡Hola a todos!

Soy Ignacio Román, y estoy encantado de poder hacer esta POC (prueba de concepto) en este blog pues me gusta aprender cosas nuevas relacionadas con la seguridad y la programación.

Primero, quería agradecer a todos aquellos que forman parte del blog por darme la oportunidad de realizar esta entrada y el trabajo que realizan informándonos con sus diferentes posts.

Esta POC está relacionada con la forma de añadir una autenticación básica a nuestros servicios REST en java y que si os gusta, podría seguir colaborando con otra entrada haciendo uso de un API management (Apigee concretamente https://apigee.com/api-management/) para poner securización tipo OAuth 2.0 y ApiKey a nuestros servicios Rest, y de esta forma “profesionalizar” el trabajo.

La idea del post es crear un servicio rest sencillo en el cual introducir autenticación http básica.

Después de mucho estudio, he decidido intentar plasmar los conocimientos que he podido aprender investigando sobre este tema.

A través de la herramienta de Spring Tool Suite(STS) que podemos descargar desde la página oficial (https://spring.io/tools/sts) hemos creado un arquetipo de proyecto con spring initializr, es decir, la estructura con las diferentes carpetas y orden del proyecto a través de https://start.spring.io/ . Para ello le indicamos un nombre de proyecto y añadimos las dependencias (que son librerías de las que hacemos uso a través de Maven, un repositorio de dependencias), en este caso con sólo la dependencia MVC, podremos crear el servicio rest que necesitamos a través de las etiquetas que nos proporciona.

Ilustración 1. Creando el proyecto.

Creamos el proyecto, dándole un nombre en group y artifact y le añadimos la dependencia MVC (web).

Después nos descargamos el arquetipo pulsando sobre “Generate Project”, lo descomprimimos en local e importamos sobre la herramienta Spring Tool Suite, haciendo click derecho sobre la pestaña Project Explorer > import y los buscamos en el directorio donde lo hayamos descomprimido.

Ilustración 2. Importando proyecto sobre la herramienta STS

Ilustración 3. Importando proyecto

Ilustración 4. Elegimos el proyecto descargado.

 

 

 

Ilustración 5. Proyecto importado

Una vez importado el proyecto, procedemos a crear un servicio rest sencillo.

Para ello nos creamos una clase java (Services.java en este caso) y a través de la etiqueta @RestController marca la clase como controlador Rest: Equivale a las etiquetas @Controller y @ResponseBody.

Creamos el método getName, que será llamado cuando reciba una llamada sobre la url “…/Saludo/{name}” y será de tipo Get como lo indica la etiqueta @GetMapping.

Con “…” me refiero a la dirección donde se encuentre alojado el servicio, en este ejemplo y dado que Spring boot incorpora un servidor local embebido, será del tipo “http://localhost:8080/Saludo/{name}

Por ejemplo: “http://localhost:8080/Saludo/Fwhibbit”

Y obtendremos como valor de retorno: Hola Fwhibbit!

La etiqueta @PathVariable nos permite introducir y añadir parámetros a la url, en este caso hemos añadido un parámetro de entrada de tipo String.

Ilustración 6. Servicio Rest.

Ejecutamos el proceso y observamos lo siguiente:

Ilustración 7. Servicio creado y levantado en el puerto 8090

Como observamos se ha creado el servicio y se ha levantado localmente en el puerto 8090.

 

Testeándolo:

Ilustración 8. Ejecución

Aquí se ve que el servicio está disponible sin requerir autenticación, puesto que aún no se ha añadido.

Para securizarlo usaremos el módulo de Spring security, con la dependencia siguiente (a través de Maven) que podemos añadir manualmente en el fichero pom.xml que se encuentra en el proyecto:

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-security</artifactId>

</dependency>

Ilustración 9. Estructura proyecto, pom.xml

 

Pulsando sobre el fichero pom.xml podremos añadir la dependencia de la siguiente manera.


Ilustración 10. Añadiendo la dependencia.

 

Ahora crearemos dos clases Java para añadir la autenticación:

Ilustración 11. Clase java «SpringSecurityConfig»

La primera clase es SpringSecurityConfig.java. Usamos la etiqueta @EnableWebSecurity para disponer de la parte de Spring security, y extendemos la clase de WebSecurityConfigurerAdapter para poder sobrescribir las características a nuestro antojo sobre una autenticación HTTP básica.

Aquí definimos nuestro punto de entrada y los credenciales. En el método configureGlobal, observamos que tanto el usuario como la contraseña es “POCfwhibbit” y se le asigna el rol de user.

En la siguiente clase Ilustración 12. Clase java «AEntryPoint», podemos observar que se ha añadido una cabecera de autenticación.

Ilustración 12. Clase java «AEntryPoint»

Esta clase es la encargada de devolver la respuesta cuando los credenciales no son los correctos. En este caso devolverá “Alert! Status 401 – “ más el mensaje correspondiente que genera.

Ahora, para hacer uso del servicio, tenemos que introducir unos credenciales (que definimos más arriba).

Ilustración 13. Insertar credenciales para acceder al servicio

Sólo nos dejará pasar si los credenciales son los correctos.

Ilustración 14. Credenciales incorrectos

La ilustración 7 nos reporta el mensaje de que los credenciales introducidos no son los correctos.

Ilustración 15. Credenciales correctos

Introducimos ahora sí los credenciales que definimos arriba (POCfwhibbit, POCfwhibbit) y obtendremos el resultado de ese servicio REST.

Ilustración 16. Resultado credenciales correctos

 

Esto ha sido todo, mi objetivo era mostrar que este tipo de autenticación existe y que no es muy difícil de implementar.

Espero que os haya parecido interesante y espero poder colaborar más adelante.

 

Un saludo!

2 comentarios en «Http Basic Authentication (Java)»

  1. Hola:
    Estupendo tutorial. Muchas gracias, Ignacio.

    Quería compartir con el resto de la comunidad mis problemas, para saber si me podrían ayudar. Gracias de antemano.
    1) Este en sí no es un problema, solo un error que me dio al no poner la versión en la dependencia del pom.xml. Al parecer, mi configuración sí me obliga a poner la versión.
    2) En la clase «SpringSecurityConfig»:
    2.1) Eclipse es incapaz de importar la anotación «@EnableWebSecurity».
    2.2) La clase «AuthenticationEntryPoint» tampoco lo encuentra.
    2.3) Ni «HttpSecurity»
    2.4) Tampoco «AuthenticationManagerBuilder.java»
    A pesar de haber importado la dependencia correctamente, que ilustras en tu ejemplo, me da estos fallos; ¿necesito otras más?

    3) En la clase «AnEntryPoint», las clases que no son detectadas son:
    3.1) BasicAuthenticationEntryPoint
    3.2) Por el error en 3.1), el método «commence» me da error (por no detectar al padre).

    Gracias por la ayuda de antemano. Estupendo tutorial. Te sigo desde hace tiempo y nunca me defraudas.

Los comentarios están cerrados.