Una vez visto lo sencillo que es proteger nuestra aplicación de una forma básica, vamos a complicar un poco la idea, trabajando con cuantos usuarios queramos, en memoria
Utilizando varios usuarios con distintos roles «harcodeados»
Nuestra nueva versión, como ya hemos visto que solo era cuestión de añadir cosas, es un poco más ambiciosa (poco, eh?)
Se trata de trabajar con más de un usuario, cada uno puede llevar ROL distinto, y se guardaran en memoria, ya que aparecen escritos en el código del programa.
Una vez más, señalamos la debilidad del sistema y el riesgo que conlleva poner usuarios y contraseñas en un repositorio, sin embargo, y con fines didácticos, mostraremos como hacerlo, y, os dejo a vosotros, si tenéis que utilizar esta modalidad, ocultar usuarios y contraseñas.
Configuración para encriptación
Esta vez, tendremos que empezar añadiendo algo de configuración. En esta versión, se hace en dos ficheros, por ordenar las cosas. El primero de ellos es para crear el Bean de encriptación, y así ya empezamos a trabajar con contraseñas encriptadas. Hemos elegido BCryptPasswordEncoder por lo que creamos una clase en el paquete config
@Configuration
public class SecurityConfiguration {
@Bean
BCryptPasswordEncoder passwordEncoder() {
BCryptPasswordEncoder bCryptPasswordEncoder = new BCryptPasswordEncoder();
return bCryptPasswordEncoder;
}
}
Configuración de usuarios y contraseñas en memoria
El segundo nos crea la configuración de los usuarios en memoria, en el ejemplo, se crean dos usuarios con distintos roles, se pueden crear los que deseéis.
@Configuration
@EnableWebSecurity
public class SecurityConfigurationInMemory {
@Autowired
BCryptPasswordEncoder passwordEncoder;
@Bean
InMemoryUserDetailsManager userDetailsService() {
UserDetails user = User.withUsername("user")
.password(passwordEncoder
.encode("1234"))
.roles("USER")
.build();
UserDetails admin = User.withUsername("admin")
.password(passwordEncoder
.encode("admin"))
.roles("USER", "ADMIN")
.build();
return new InMemoryUserDetailsManager(user, admin);
}
}
Para cada usuario, se ha de crear un objeto UserDetails, en él se indica toda la información del usuario, además de username y la contraseña, y el/los roles . Observad que las contraseñas. Se guardan encriptadas
Al finalizar retornamos la lista de usuarios, como objetos UserDetails y ya estamos listos para usarlos
Autorización por rutas
Ahora, indicaremos los usuarios (por Roles) que deseamos que puedan visitar nuestras rutas.
En este ejemplo,
- permitimos que los USER puedan visitarlo todo, utilizando el verbo GET
- permitimos que los usuarios con el rol de ADMIN puedan visitar nuestra ruta en cualquier modo,
El código sería:
@Configuration
@EnableWebSecurity
public class FiltroConfiguracionSeguridad {
@Bean
SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http
.csrf(csrf -> csrf.disable())
.authorizeHttpRequests(authorize -> authorize
.requestMatchers(HttpMethod.GET, "/api/*").hasRole("USER")
.requestMatchers("/api/*").hasRole("ADMIN")
)
.httpBasic(withDefaults());
return http.build();
}
}
Accediendo vía API
Hemos estado utilizando un navegador para realizar las pruebas, pero, un caso más real, sería que los datos viajarán vía API; con la estructura actual, y utilizando POSTMAN para las pruebas, haríamos algo como
que funcionará, siempre que
Si intentamos utilizar otro usuario y/o contraseña, recibiremos error
Ahora, hemos visto que podemos utilizar todos los usuarios que queramos, asignarles los roles que se nos ocurran, construir los UserDetails que necesitemos, y todo funcionará bien. Nuestro siguiente paso, crear una mini tabla de usuarios, y ver que también podemos controlar nuestra seguridad con ella. cosa que hacemos en el siguiente artículo, pero que sepais que unicamente tengo que crear un UserDetailService que reciba un usuario y que sea capaz de crear un UserDetail
Conclusión
El utilizar usuarios embebidos puede ser una forma de trabajar con seguridad sin necesidad de explotar una tabla de usuarios, aunque se deberia pensar un poco como generar las contraseñas, y como hacerlas llegar a los usuarios; Quizas por correo electrónico?
GitHub: https://github.com/recursosformacion/SpringYouTube/tree/110-security_inmemoriam/CrudLosCines
𝐃𝐞𝐬𝐚𝐫𝐫𝐨𝐥𝐥𝐨 𝐛𝐚𝐬𝐞:https://recursosformacion.com/2023/10/vision-de-conjunto-con-spring/
Inicio SpringSecurity:https://recursosformacion.com/2024/09/empezando-con-spring-security/
Relacionado
Descubre más desde Recursos para formacion
Suscríbete y recibe las últimas entradas en tu correo electrónico.