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 i admin.
  • configure(HttpSecurity http): Configura les regles d'autorització. Els usuaris amb el rol ADMIN poden accedir a /admin/**, els usuaris amb el rol USER poden accedir a /user/**, i qualsevol pot accedir a / i /home.
  • passwordEncoder(): Defineix un PasswordEncoder 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

  1. Crea un nou projecte Spring Boot.
  2. Afegeix les dependències de Spring Security.
  3. Configura l'autenticació en memòria amb dos usuaris.
  4. Configura les regles d'autorització per a diferents rutes.
  5. 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

Mòdul 2: Conceptes bàsics de Spring Boot

Mòdul 3: Construint serveis web RESTful

Mòdul 4: Accés a dades amb Spring Boot

Mòdul 5: Seguretat a Spring Boot

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ó

Mòdul 10: Millors pràctiques i consells

© Copyright 2024. Tots els drets reservats