Spring Security es el framework (marco de trabajo) encargado de gestionar todo lo relativo a la seguridad dentro de Spring/Spring Boot.

Algunas de las funciones/características principales las que se encarga son Spring Securiy son:

  • Protocolos de seguridad.
  • Roles para los accesos a los recursos o no.
  • Autentificación y autorización con Spring Secutiry.

Mediante a estos mecanismos vamos a intentar proteger la aplicación de una manera sencilla y sin afectar a la lógica de negocio.

Para comenzar tenemos que o bien crear un proyecto con STS4:

O si ya tenemos un proyecto creado, añadir las siguientes dependencias al pom.xml:

https://gist.github.com/DavidBernalGonzalez/05a00ad3dba254c7d2280533896ac898

Si ahora arrancamos la aplicación, podemos ver que:

Hay varias maneras de ejecutar la aplicación, os pongo otra:

Aunque yo aconsejo la primera que hemos visto debido a que seleccionamos específicamente la clase que queremos ejecutar en este caso el Main de nuestra aplicación.

Y veremos que se nos ve algo similar a lo siguiente:

Si nos fijamos la aplicación arranca pero no hace nada. De hecho, si nos metemos en localhost:8080/ podemos ver que nuestra petición nos muestra un error debido a que no tenemos un controlador, ni un end point en su interior que controle que hacer, como responder a esa petición.

Para que empiece a «hacer algo», tenemos que añadir otra dependencia la proyecto. La dependencia concreta que añadiremos será la de spring-boot-strarter-web. Esta dependencia, nos permitirá iniciar la creación de aplicaciones web, incluidas RESTful.

Si ahora arrancamos de nuevo nuestra aplicación, podemos comprobar que la consola de Spring se diferencia por varias cosas entre las que destaca el mensaje donde de detalla el puerto de Tomcat y el mensaje de la contraseña que ha generado Spring para usar.

Si ahora arrancamos de nuevo la aplicación, pese a que como en la casuística anterior no tenemos controlada ningún respuesta a un end point (por ejemplo si realizamos una petición al end point o ruta localhost:8080/ el caso anterior no nos respondía), ni tampoco ningún controllador donde poder definir la respuesta a dichos end points. Podemos comprobar que si realizamos una petición a localhost:8080 (el puerto por defecto de Spring boot), misteriosamente y a diferencia del caso anterior, la petición nos responde con una ventana de login.

Si no tenemos un controllador que maneje las respuestas a los end points ni tampoco end points ¿Cómo es esto posible? Pues la respuesta es bastante más sencilla de lo que parece y se basa en que Spring Secutiry por defecto, bloquea todas las peticiones entrantes sea el end point que sea a excepción de que el usuario que intenta acceder a este end point este autorizado y tenga permisos de accesos. Y esto se produce independientemente de si existe el end point o no, lo que realmente hace spring security es preguntarse ¿Tienes accesos para acceder al end point que me estás solicitando?

Tipos de end points

Para poder hablar sobre las diferentes casuísticas que nos podemos encontrar es necesario subdividir los ends points en dos tipos:

  • Los end points «PUBLICOS» que dejaremos que todo el mundo acceda independientemente de si está registrado o no.
  • Los end points «PRIVADOS» a los que solamente accederán los usuarios autorizados para ello (los veremos en la próxima lección).

Como ya hemos visto Spring security trata por defecto a todos los end points como «PRIVADOS» por ello, aunque no exista el end point o no primeramente no estamos logeados, nos pedirá que hagamos login. Esto lo podemos modificar si le indicamos que algún end point no requiera autentificación.

Vamos a empezar a picar código para realizar un sencillo ejercicio de ejemplo sobre esto:

El Main contendrá:

SecurityConfig es el fichero que contendrá todo lo referente a las contraseñas.

  • Nos aparecerá una ventana de logeo, si nos logeamos correctamente, la siguiente pregunta será ¿Hay algún controlador que controle la respuesta que mandaremos a un end point?
    • Si la respuesta es no, se enviará el mismo que error que en el ejemplo anterior: «No se puede acceder a este sitio web». Esto se produce debido a que no hemos creado un controlador que capture la petición y nos diga donde tenemos que ir.
  • Si ahora realizamos el logeo con el usuario con user que tiene como rol usuario:
  • En cambio, si realizamos el logeo con el usuario admin que tiene como ROL administrador:

Bueno esto es todo en esta lección, espero que os haya servido. Ya podéis realizar un registro que mantendrá vuestras aplicaciones más seguras. Un saludo javeros y javeras!