Dentro del contexto de la herramientas y componentes que nos provee spring se encuentra utilidades para aplicar seguridad de nuestras aplicaciones, para ello Spring nos brinda un módulo para facilitar estas tareas. Solo basta el poder incluir dicho modulo a nuestro proyecto y realizar algunas configuraciones para su correcto uso. Con el módulo de Spring security podemos, login de usuarios, niveles de acceso y/o roles para nuestra aplicación, restricción de métodos o clases, para ciertos usuarios, y otras funciones según la necesidad y/o funcionalidades de nuestra app.
Para configurar el modulo primero debemos agregarlo a nuestra app para ello en el archivo pom.xml agregamos las siguientes líneas.
Primero creamos unas clases de Entidad para poder guardar y gestionar los usuarios y roles en nuestra aplicación. Creamos el primer archivo en el paquete entity, ha dicho archivo le agregamos el siguiente código.
Esta será la clase de entidad de usuarios de nuestra app dependiendo de las necesidades pueden agregarse los campos necesarios. ahora creamos la otra clase que será la que permita gestionar los roles de los usuarios en el desarrollo, agregamos el siguiente código.
Como podemos ver son clases anotadas de entidad que se enlazan por medio de relaciones para su gestión de roles asignados a los usuarios.
Ahora creamos un repositorio para la gestión de los usuarios. Creamos una interface en el paquete repository y agregamos el siguiente código
package com.proyecto.repository;
import java.io.Serializable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import com.proyecto.entity.User;
@Repository("userRepository")
public interface UserRepository extends JpaRepository<User, Serializable>{
public User findByUsername(String username);
}
Recordar que la creación del repositorio implementa la mayoría de los métodos de gestión de los datos, en este caso solo agregamos un método que nos servirá para la búsqueda especifica del usuario por el nombre.
Ahora para se debe crear el componente de servicio que nos ayudara a poder gestionar los elementos para poder armar la data de permisos y usuarios para poder usarlos en la app. para ello creamos en el paquete service y en agregamos el siguiente código.
De esta clase lo que debemos destacar es que se usa un llamado del objeto User que es una implementación del Core del paquete de seguridad, este nos da permite el uso de ciertas propiedades básicas de nuestro usuario como son el nombre y la clave, pero además implementa algunas propiedades para validar el estado del usuario, ahora con la lógica de la implementación rellenamos dichos datos con la información que necesitamos de nuestra entidad y los roles que esta posea, esto es clave en la gestión de los roles ya que debemos saber exactamente que usuario y sus roles se usan en la petición en este caso cuando se de el logueo.
Ahora debemos de crear un elemento para la configuración de las propiedades básicas para el realizar el login y que se realicen algunas gestiones automáticas para ello en el paquete configuration creamos un archivo con el siguiente código.
En dicha clase se configuran, las url de donde se enviaran las peticones para procesar el ingreso de los usuarios, la url para enviar la peticon de deslogueo, asi como los sitios que estan permitidos el acceso sin seguridad. Adicionalmente hay un metodo para encriptar el parametro de la clave que se envia.
Para ir finalizando creaamos el controlador con el siguiente codigo.
Este es el formulario para el acceso lo que debemos notar aquí que por el módulo de seguridad se maneja el uso de un token este se hace enviando un dato en el campo oculto que se define en el formulario.
Ya con todos los elementos arrancamos el servidor y hacemos las pruebas para validar que nuestro acceso sea correcto. primero lo que tenemos que comprobar es que al querer acceder a alguna de la url que tengamos mapeados, siempre nos re direcciona a la vista del login.
Si esto es correcto ingresamos los datos que tengamos almacenados para un usuario y comprobamos el poder ingresar a nuestra app. si todo es correcto al loguearnos podremos ver la vista a la cual se re direcciona por defecto o sea la que configuramos en nuestro controlador.
Con los roles que gestionamos podemos limitar el acceso a ciertos accesos estos se pueden configurar ya sea que queramos limitar el acceso a una clase, método, servicio o repositorio.
Para ello solo basta con anotar el elemento con el siguiente código
@PreAuthorize("hasRole('ROLE_ADMIN')")
Está anotación lo que valida es el rol que este asociado al usuario que se a logueado, y si este tiene el permiso adecuado puede acceder a el elemento al cual se está gestionando la petición, como parámetro le podemos pasar una serie de roles o algunas funciones que permitan el limitar a los usuarios de acuerdo a las reglas de acceso que los dueños de la app definan.