En aquest tema, aprendrem com implementar l'autenticació i l'autorització d'usuaris en una aplicació Spring Boot utilitzant Spring Security. Aquestes funcionalitats són essencials per assegurar que només els usuaris autoritzats puguin accedir a determinades parts de la teva aplicació.
Objectius
- Entendre els conceptes bàsics d'autenticació i autorització.
- Configurar l'autenticació d'usuaris amb Spring Security.
- Implementar l'autorització per restringir l'accés a recursos específics.
Conceptes bàsics
Autenticació
L'autenticació és el procés de verificar la identitat d'un usuari. En una aplicació web, això normalment es fa mitjançant un formulari de login on l'usuari introdueix el seu nom d'usuari i contrasenya.
Autorització
L'autorització és el procés de determinar si un usuari autenticat té permís per accedir a un recurs específic. Això es fa mitjançant rols i permisos.
Configuració de Spring Security
Dependències
Primer, assegura't d'afegir les dependències necessàries al teu projecte pom.xml
:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-test</artifactId> <scope>test</scope> </dependency>
Configuració bàsica de seguretat
Crea una classe de configuració de seguretat que estengui WebSecurityConfigurerAdapter
:
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder; @Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth.inMemoryAuthentication() .withUser("user").password(passwordEncoder().encode("password")).roles("USER") .and() .withUser("admin").password(passwordEncoder().encode("admin")).roles("ADMIN"); } @Override protected void configure(HttpSecurity http) throws Exception { http .authorizeRequests() .antMatchers("/admin/**").hasRole("ADMIN") .antMatchers("/user/**").hasRole("USER") .antMatchers("/", "/home").permitAll() .anyRequest().authenticated() .and() .formLogin() .loginPage("/login") .permitAll() .and() .logout() .permitAll(); } @Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); } }
Explicació del codi
configure(AuthenticationManagerBuilder auth)
: Configura l'autenticació en memòria amb dos usuaris:user
iadmin
.configure(HttpSecurity http)
: Configura les regles d'autorització. Els usuaris amb el rolADMIN
poden accedir a/admin/**
, els usuaris amb el rolUSER
poden accedir a/user/**
, i qualsevol pot accedir a/
i/home
.passwordEncoder()
: Defineix unPasswordEncoder
per encriptar les contrasenyes.
Formulari de login personalitzat
Crea una pàgina de login personalitzada (login.html
):
<!DOCTYPE html> <html> <head> <title>Login</title> </head> <body> <h2>Login</h2> <form method="post" action="/login"> <div> <label>Username:</label> <input type="text" name="username"/> </div> <div> <label>Password:</label> <input type="password" name="password"/> </div> <div> <button type="submit">Login</button> </div> </form> </body> </html>
Exercici pràctic
Objectiu
Implementar una aplicació Spring Boot amb autenticació i autorització bàsica.
Passos
- Crea un nou projecte Spring Boot.
- Afegeix les dependències de Spring Security.
- Configura l'autenticació en memòria amb dos usuaris.
- Configura les regles d'autorització per a diferents rutes.
- Crea una pàgina de login personalitzada.
Solució
// SecurityConfig.java import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder; @Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth.inMemoryAuthentication() .withUser("user").password(passwordEncoder().encode("password")).roles("USER") .and() .withUser("admin").password(passwordEncoder().encode("admin")).roles("ADMIN"); } @Override protected void configure(HttpSecurity http) throws Exception { http .authorizeRequests() .antMatchers("/admin/**").hasRole("ADMIN") .antMatchers("/user/**").hasRole("USER") .antMatchers("/", "/home").permitAll() .anyRequest().authenticated() .and() .formLogin() .loginPage("/login") .permitAll() .and() .logout() .permitAll(); } @Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); } }
<!-- login.html --> <!DOCTYPE html> <html> <head> <title>Login</title> </head> <body> <h2>Login</h2> <form method="post" action="/login"> <div> <label>Username:</label> <input type="text" name="username"/> </div> <div> <label>Password:</label> <input type="password" name="password"/> </div> <div> <button type="submit">Login</button> </div> </form> </body> </html>
Resum
En aquesta secció, hem après com configurar l'autenticació i l'autorització d'usuaris en una aplicació Spring Boot utilitzant Spring Security. Hem vist com definir usuaris en memòria, com configurar les regles d'autorització i com crear una pàgina de login personalitzada. Aquestes habilitats són fonamentals per assegurar la teva aplicació i protegir els recursos sensibles.
Curs de Spring Boot
Mòdul 1: Introducció a Spring Boot
- Què és Spring Boot?
- Configuració del teu entorn de desenvolupament
- Creant la teva primera aplicació Spring Boot
- Entenent l'estructura del projecte Spring Boot
Mòdul 2: Conceptes bàsics de Spring Boot
- Anotacions de Spring Boot
- Injecció de dependències a Spring Boot
- Configuració de Spring Boot
- Propietats de Spring Boot
Mòdul 3: Construint serveis web RESTful
- Introducció als serveis web RESTful
- Creant controladors REST
- Gestionant mètodes HTTP
- Gestió d'excepcions en REST
Mòdul 4: Accés a dades amb Spring Boot
- Introducció a Spring Data JPA
- Configuració de fonts de dades
- Creant entitats JPA
- Utilitzant repositoris de Spring Data
- Mètodes de consulta a Spring Data JPA
Mòdul 5: Seguretat a Spring Boot
- Introducció a Spring Security
- Configuració de Spring Security
- Autenticació i autorització d'usuaris
- Implementant autenticació JWT
Mòdul 6: Proves a Spring Boot
Mòdul 7: Funcions avançades de Spring Boot
Mòdul 8: Desplegant aplicacions Spring Boot
Mòdul 9: Rendiment i monitorització
- Optimització del rendiment
- Monitorització amb Spring Boot Actuator
- Utilitzant Prometheus i Grafana
- Gestió de registres i logs