<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/"
    xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" version="2.0">
    <channel>
        
        <title>
            <![CDATA[ spring boot - freeCodeCamp.org ]]>
        </title>
        <description>
            <![CDATA[ Impara a programmare gratuitamente! Tutorial di programmazione su Python, JavaScript, Linux e molto altro. ]]>
        </description>
        <link>https://www.freecodecamp.org/italian/news/</link>
        <image>
            <url>https://cdn.freecodecamp.org/universal/favicons/favicon.png</url>
            <title>
                <![CDATA[ spring boot - freeCodeCamp.org ]]>
            </title>
            <link>https://www.freecodecamp.org/italian/news/</link>
        </image>
        <generator>Eleventy</generator>
        <lastBuildDate>Tue, 23 Jun 2026 20:19:36 +0000</lastBuildDate>
        <atom:link href="https://www.freecodecamp.org/italian/news/tag/spring-boot/rss.xml" rel="self" type="application/rss+xml" />
        <ttl>60</ttl>
        
            <item>
                <title>
                    <![CDATA[ Come impostare l'autorizzazione e l'autenticazione JWT con Java Spring Boot ]]>
                </title>
                <description>
                    <![CDATA[ Lo scorso mese, ho avuto la possibilità di implementare il sistema di autenticazione JWT per uno dei miei progetti. Ho lavorato precedentemente con JWT in Ruby on Rails, ma questa è stata la mia prima volta con Spring Boot. In questo tutorial, proverò a spiegare cosa ho imparato e come ]]>
                </description>
                <link>https://www.freecodecamp.org/italian/news/come-impostare-lautorizzazione-e-lautenticazione-jwt-con-java-spring-boot/</link>
                <guid isPermaLink="false">63205a689a423c074eb492a5</guid>
                
                    <category>
                        <![CDATA[ spring boot ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Guido Cusani ]]>
                </dc:creator>
                <pubDate>Wed, 28 Sep 2022 05:30:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/italian/news/content/images/2022/09/jwt.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Articolo originale:</strong> <a href="https://www.freecodecamp.org/news/how-to-setup-jwt-authorization-and-authentication-in-spring/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">How to Set Up Java Spring Boot JWT Authorization and Authentication</a>
      </p><p>Lo scorso mese, ho avuto la possibilità di implementare il sistema di autenticazione JWT per uno dei miei progetti. Ho lavorato precedentemente con JWT in Ruby on Rails, ma questa è stata la mia prima volta con Spring Boot.</p><p>In questo tutorial, proverò a spiegare cosa ho imparato e come l'ho applicato all'interno del mio progetto per condividere le mie esperienze, sperando che possano essere d'aiuto.</p><p>Inizieremo dando un rapido sguardo alla teoria dietro JWT e il suo funzionamento. Successivamente guarderemo insieme come implementarlo all'interno di una applicazione Spring Boot.</p><h2 id="fondamenti-di-jwt"><strong>Fondamenti di <strong>JWT</strong></strong></h2><p>JWT, o JSON Web Tokens (<a href="https://tools.ietf.org/html/rfc7519" rel="noopener">RFC 7519</a>), è uno standard comunemente usato per rendere sicure le API REST. Nonostante sia una tecnologia relativamente giovane è diventata rapidamente popolare.</p><p>Nel processo di autenticazione JWT, il front end (il client) invia per primo alcune credenziali da utilizzare per l'autenticazione (nel nostro caso, username e password, perché stiamo lavorando su una app web).</p><p>Il server (nel nostro caso l'app con Spring Boot) poi, controlla le credenziali ricevute, se sono valide genera il JWT e lo restituisce.</p><p>Dopo questo passaggio, il client deve inviare questo il token nell'intestazione di <strong>Autorizzazione </strong>della richiesta, nel modulo “Bearer TOKEN”. Il back end controllerà la validità del token e autorizzerà o meno la richiesta. Il token potrebbe anche contenere informazioni sull'utente e le relative autorizzazioni in base al suo ruolo.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2020/08/1.jpg" class="kg-image" alt="1" width="600" height="400" loading="lazy"></figure><h2 id="implementazione"><strong>Implementazione</strong></h2><p>Adesso vediamo come implementare il meccanismo di login e salvataggio con JWT in una vera applicazione Spring Boot.</p><h3 id="dipendenze"><strong>Dipendenze</strong></h3><p>Puoi vedere la lista di dipendenze Maven di cui abbiamo bisogno nel codice qui sotto. Nota che le principali dipendenze, come Spring Boot e Hibernate, non sono incluse nello screenshot.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2020/08/2-1.png" class="kg-image" alt="2-1" width="600" height="400" loading="lazy"></figure><h3 id="salvataggio-utenti"><strong>Salvataggio Utenti</strong></h3><p>Inizieremo con la creazione dei controller per salvare gli utenti in modo sicuro e autenticarli in base ai loro username e password.</p><p>Abbiamo un'entità modello chiamata User. Questa è una semplice classe che mappa la tabella nel database chiamata <strong><strong>USER</strong>. </strong>Puoi usare qualsiasi proprietà di cui hai bisogno a seconda della tua applicazione. </p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2020/08/3-1.png" class="kg-image" alt="3-1" width="600" height="400" loading="lazy"></figure><p>Abbiamo anche una semplice classe <strong>UserRepository</strong> per salvare gli utenti. Dobbiamo sovrascrivere il metodo <strong>findByUsername </strong>visto che lo useremo nell'autenticazione.</p><p>Creiamo un'interfaccia chiamandola <strong><strong>UserRepository</strong> </strong>e estendiamola con<strong> JpaRepository</strong>. Questa ci servirà<strong> </strong>per la gestione degli utenti. Inoltre c'è bisogno di sovrascrivere il metodo <strong><strong>findByUsername</strong> </strong>per l'autenticazione.</p><pre><code class="language-java">public interface UserRepository extends JpaRepository&lt;User, String&gt;{ 
    User findByUsername(String username); 
}</code></pre><p>Non dovremmo mai memorizzare le password nel database in testo non crittografato, perché molti utenti tendono ad usare la stessa password per più siti.</p><p>Esistono diversi algoritmi di hash, ma il più usato è <strong><strong>BCrypt </strong></strong>ed è un metodo sicuro per criptare le password. Puoi controllare <a href="https://security.blogoverflow.com/2013/09/about-secure-password-hashing/#:~:text=Passwords%20should%20be%20hashed%20with,providing%20most%20security%20is%20bcrypt.">questo</a> articolo per maggiori informazioni sull'argomento.</p><p>Per criptare le password definiamo un bean chiamato <strong><strong>BCrypt</strong> </strong>all'interno della <strong><strong>@SpringBootApplication</strong> </strong>e annotiamo la classe principale in questo modo:</p><pre><code class="language-java">@Bean public BCryptPasswordEncoder bCryptPasswordEncoder() {
    return new BCryptPasswordEncoder(); 
}</code></pre><p>Chiameremo i metodi all'interno di questo bean quando avremo bisogno di criptare una password.</p><p>Abbiamo anche bisogno di un controller, UserController, per salvare gli utenti. Una volta creato lo annotiamo con <strong><strong>@RestController</strong> </strong>e ne definiamo il corretto mapping.</p><p>Nella nostra applicazione, salveremo l'utente attraverso l'oggetto DTO ricevuto dal front end. Puoi anche passare un oggetto User attraverso il body sfruttando l'annotazione <strong><strong>@RequestBody</strong></strong>.</p><p>Dopo aver passato l'oggetto DTO, possiamo criptare il campo della password usando il suo getter passandolo al metodo che abbiamo definito nel bean <strong><strong>BCrypt</strong>. </strong>Potresti farlo anche nel controller, ma è una pratica migliore farlo nella classe service.</p><pre><code class="language-java">@Transactional(rollbackFor = Exception.class) 
public String saveDto(UserDto userDto) { 
    userDto.setPassword(bCryptPasswordEncoder
           .encode(userDto.getPassword())); 
    return save(new User(userDto)).getId(); 
}</code></pre><h3 id="filtro-di-autenticazione"><strong>Filtro di Autenticazione</strong></h3><p>Abbiamo bisogno dell'autenticazione per confermare che l'utente sia davvero chi dice di essere. A questo scopo, useremo la classica coppia username/password.</p><p>Ecco i passaggi per l'autenticazione:</p><ol><li>Creare un filtro di autenticazione che estende <strong><strong>UsernamePasswordAuthenticationFilter</strong></strong></li><li>Creare una classe per la configurazione della security che estende <strong><strong>WebSecurityConfigurerAdapter</strong> </strong>e applicare il filtro.</li></ol><p>Ecco il codice per il nostro filtro di autenticazione – come puoi immaginare, i filtri sono il fulcro di Spring Security.</p><figure class="kg-card kg-code-card"><pre><code>public class JWTAuthenticationFilter extends UsernamePasswordAuthenticationFilter {

    private AuthenticationManager authenticationManager;

    public JWTAuthenticationFilter(AuthenticationManager authenticationManager) {
        this.authenticationManager = authenticationManager;

        setFilterProcessesUrl("/api/services/controller/user/login"); 
    }

    @Override
    public Authentication attemptAuthentication(HttpServletRequest req,
                                                HttpServletResponse res) throws AuthenticationException {
        try {
            User creds = new ObjectMapper()
                    .readValue(req.getInputStream(), User.class);

            return authenticationManager.authenticate(
                    new UsernamePasswordAuthenticationToken(
                            creds.getUsername(),
                            creds.getPassword(),
                            new ArrayList&lt;&gt;())
            );
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    @Override
    protected void successfulAuthentication(HttpServletRequest req,
                                            HttpServletResponse res,
                                            FilterChain chain,
                                            Authentication auth) throws IOException {
        String token = JWT.create()
                .withSubject(((User) auth.getPrincipal()).getUsername())
                .withExpiresAt(new Date(System.currentTimeMillis() + EXPIRATION_TIME))
                .sign(Algorithm.HMAC512(SECRET.getBytes()));

        String body = ((User) auth.getPrincipal()).getUsername() + " " + token;

        res.getWriter().write(body);
        res.getWriter().flush();
    }
}</code></pre><figcaption><a href="https://gist.github.com/yigiterinc/74e24d263cc403a9057cf046d514860a#file-jwtauthenticationfilter-java">JWTAuthenticationFilter.java </a>hosted with ❤ by <a href="https://github.com/">GitHub</a></figcaption></figure><p>Analizziamo ogni step di questo codice.</p><p>Questa classe estende <strong><strong>UsernamePasswordAuthenticationFilter</strong>, </strong>che è la classe di default per l'autenticazione con password in Spring Security. L'abbiamo estesa per definire la nostra logica di autenticazione personalizzata.</p><p>Chiamiamo il metodo <strong><strong>setFilterProcessesUrl</strong> </strong>nel nostro costruttore. Questo metodo imposta l'URL di login di default al parametro dato.</p><p>Se rimuovi questa riga, Spring Security crea un endpoint <strong><strong>“/login”</strong> </strong>di default. Definisce l'endpoint per noi, motivo per cui non definiamo un endpoint di login esplicitamente nel nostro controller.</p><p>Dopo questa riga il nostro endpoint per il login sarà <strong><strong>/api/services/controller/user/login</strong></strong>. Puoi usare questa funzione essere coerente con i tuoi endpoint.</p><p>Sovrascriviamo i metodi <strong><strong>attemptAuthentication</strong> </strong>e <strong><strong>successfulAuthentication</strong> </strong>della classe <strong><strong>UsernameAuthenticationFilter</strong></strong>.</p><p>La funzione <strong><strong>attemptAuthentication</strong> </strong>verrà eseguita quando l'utente tenta di effettuare il login nell'applicazione. Legge le credenziali, crea un utente POJO e controlla le credenziali da autenticare.</p><p>Passiamo username, password e una lista vuota. La lista vuota rappresenta le autorità (ruoli). In questo caso, la lasciamo vuota perché non abbiamo ancora alcun ruolo nella nostra applicazione.</p><p>Se l'autenticazione va a buon fine, il metodo <strong><strong>successfulAuthentication</strong> </strong>viene eseguito. I valori dei parametri sono passati implicitamente da Spring Security.</p><p>Il metodo <strong><strong>attemptAuthentication</strong> </strong>restituisce un oggetto <strong><strong>Authentication</strong> </strong>che contiene le autorità passate nel frattempo.</p><p>Vogliamo restituire il token all'utente dopo la sua corretta autenticazione, quindi creiamo il token usando lo username, la chiave segreta e la data di scadenza. Definiamo quindi <strong><strong>SECRET</strong></strong> e <strong><strong>EXPIRATION_DATE</strong>.</strong></p><figure class="kg-card kg-code-card"><pre><code>public class SecurityConstants {

  public static final String SECRET = "SECRET_KEY";
  public static final long EXPIRATION_TIME = 900_000; // 15 mins
  public static final String TOKEN_PREFIX = "Bearer ";
  public static final String HEADER_STRING = "Authorization";
  public static final String SIGN_UP_URL = "/api/services/controller/user";
}</code></pre><figcaption><a href="https://gist.github.com/yigiterinc/9c612aaeb05234f4b89caf4204942a1e#file-securityconstants-java">SecurityConstants.java </a>hosted with ❤ by <a href="https://github.com/">GitHub</a></figcaption></figure><p>Abbiamo creato una classe che contiene le nostre costanti. Puoi definire qualsiasi chiave segreta tu voglia, ma una buona pratica è usare una chiave con una lunghezza uguale al tuo hash. In questo esempio, usiamo l'algoritmo <strong><strong>HS256</strong></strong>, quindi la chiave segreta è di 256 bit/32 caratteri.</p><p>La scadenza è impostata a 15 minuti, questo perché è considerata una buona abitudine per evitare che la nostra chiave sia soggetta ad attacchi di forza bruta. Il tempo è in millisecondi.</p><p>Abbiamo preparato il filtro di autenticazione, ma non è ancora attivo. Abbiamo anche bisogno di un filtro di autorizzazione, e li utilizzeremo entrambi attraverso una classe di configurazione.</p><p>Questo filtro controllerà l'esistenza e la validità del token nell'intestazione dell'autorizzazione. Specificheremo quali endpoint saranno soggetti a questo filtro nella classe di configurazione.</p><h3 id="filtro-di-autorizzazione"><strong>Filtro di autorizzazione</strong></h3><figure class="kg-card kg-code-card"><pre><code>public class JWTAuthorizationFilter extends BasicAuthenticationFilter {

    public JWTAuthorizationFilter(AuthenticationManager authManager) {
        super(authManager);
    }

    @Override
    protected void doFilterInternal(HttpServletRequest req,
                                    HttpServletResponse res,
                                    FilterChain chain) throws IOException, ServletException {
        String header = req.getHeader(HEADER_STRING);

        if (header == null || !header.startsWith(TOKEN_PREFIX)) {
            chain.doFilter(req, res);
            return;
        }

        UsernamePasswordAuthenticationToken authentication = getAuthentication(req);

        SecurityContextHolder.getContext().setAuthentication(authentication);
        chain.doFilter(req, res);
    }

    // Reads the JWT from the Authorization header, and then uses JWT to validate the token
    private UsernamePasswordAuthenticationToken getAuthentication(HttpServletRequest request) {
        String token = request.getHeader(HEADER_STRING);

        if (token != null) {
            // parse the token.
            String user = JWT.require(Algorithm.HMAC512(SECRET.getBytes()))
                    .build()
                    .verify(token.replace(TOKEN_PREFIX, ""))
                    .getSubject();

            if (user != null) {
                // new arraylist means authorities
                return new UsernamePasswordAuthenticationToken(user, null, new ArrayList&lt;&gt;());
            }

            return null;
        }

        return null;
    }</code></pre><figcaption><a href="https://gist.github.com/yigiterinc/353558bb33a0d4bfb37c054bf3ef2abf#file-jwtauthorizationfilter-java">JWTAuthorizationFilter.java </a>hosted with ❤ by <a href="https://github.com/">GitHub</a></figcaption></figure><p>Il metodo <strong><strong>doFilterInternal</strong> </strong>intercetta la richiesta e controlla l'intestazione di Autorizzazione. Se l'header non è presente o non inizia per "BEARER" procede con la catena di filtri.</p><p>Se l'intestazione è presente, verrà invocato il metodo <strong><strong>getAuthentication</strong></strong>, che<strong> </strong>verifica il JWT e se il token è valido restituisce un token di accesso che Spring userà internamente.</p><p>Questo nuovo token è salvato nel SecurityContext. Se hai bisogno di un tipo di autorizzazione in base al ruolo puoi passare questo token in Authorities.</p><p>I nostri filtri sono pronti e dobbiamo farli entrare in azione grazie all'aiuto di una classe di configurazione.</p><h3 id="configurazione"><strong>Configurazione</strong></h3><figure class="kg-card kg-code-card"><pre><code>@EnableWebSecurity
public class WebSecurity extends WebSecurityConfigurerAdapter {

    private UserDetailsServiceImpl userDetailsService;
    private BCryptPasswordEncoder bCryptPasswordEncoder;

    public WebSecurity(UserDetailsServiceImpl userService, BCryptPasswordEncoder bCryptPasswordEncoder) {
        this.userDetailsService = userService;
        this.bCryptPasswordEncoder = bCryptPasswordEncoder;
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.cors().and().authorizeRequests()
                .antMatchers(HttpMethod.POST, SIGN_UP_URL).permitAll()
                .anyRequest().authenticated()
                .and()
                .addFilter(new JWTAuthenticationFilter(authenticationManager()))
                .addFilter(new JWTAuthorizationFilter(authenticationManager()))
                // this disables session creation on Spring Security
                .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
    }

    @Override
    public void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(userDetailsService).passwordEncoder(bCryptPasswordEncoder);
    }

    @Bean
    CorsConfigurationSource corsConfigurationSource() {
        final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();

        CorsConfiguration corsConfiguration = new CorsConfiguration().applyPermitDefaultValues();
        source.registerCorsConfiguration("/**", corsConfiguration);

        return source;
    }
}</code></pre><figcaption><a href="https://gist.github.com/yigiterinc/5aed60bcf1c53b34ed6b6e887158bbc0#file-websecurity-java">WebSecurity.java </a>hosted with ❤ by <a href="https://github.com/">GitHub</a></figcaption></figure><p>La classe è annotata con <strong><strong>@EnableWebSecurity</strong></strong> &nbsp;ed estende <strong><strong>WebSecurityConfigureAdapter</strong> </strong>per implementare la nostra logica per la sicurezza.</p><p>Sfruttiamo l'autowire del bean BCrypt che abbiamo definito precedentemente. Facciamo lo stesso con <strong><strong>UserDetailsService</strong> </strong>per<strong> </strong>trovare l'account dell'utente.<strong> </strong></p><p>Il metodo più importante è quello che accetta un oggetto <strong><strong>HttpSecurity</strong></strong>. Qui specifichiamo gli endpoint e i filtri che vogliamo applicare. Configuriamo il filtro CORS e permettiamo tutte le richieste POST al nostro URL di registrazione definito nella classe delle costanti.</p><p>Puoi aggiungere altri antMatchers per filtrare gli URL e i ruoli. Puoi leggere <a href="https://stackoverflow.com/questions/44067650/spring-security-role-based-access">questa discussione </a>su StackOverflow per vedere un esempio. L'altro metodo configura l'<strong><strong>AuthenticationManager</strong> </strong>per usare l'oggetto codificatore per poter codificare le password durante il controllo delle credenziali.</p><h3 id="testing"><strong><strong>Testing</strong></strong></h3><p>Inviamo qualche richiesta per testare se funziona a dovere.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2020/08/4.png" class="kg-image" alt="4" width="600" height="400" loading="lazy"></figure><p>In questo esempio, abbiamo inviato una richiesta GET per accedere ad una risorsa protetta. Il nostro server risponde con un codice 403. È quello che ci aspettavamo poiché non abbiamo fornito il token nell'intestazione. Adesso, creiamo un utente:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2020/08/5.png" class="kg-image" alt="5" width="600" height="400" loading="lazy"></figure><p>Per la creazione di un utente abbiamo inviato una richiesta POST contenente i dati DTO User. Useremo questo utente per effettuare un login e ottenere il token. </p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2020/08/6.png" class="kg-image" alt="6" width="600" height="400" loading="lazy"></figure><p>Grande! Abbiamo il token. A questo punto lo useremo per poter accedere a risorse protette.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/news/content/images/2020/08/7.png" class="kg-image" alt="7" width="600" height="400" loading="lazy"></figure><p>Abbiamo fornito il token nella chiave di Autorizzazione dell'intestazione e adesso abbiamo il permesso di accedere all'endpoint protetto.</p><h2 id="conclusione"><strong>Conclusione</strong></h2><p>In questo tutorial, ti ho guidato attraverso gli step che ho intrapreso per implementare l'autorizzazione JWT e l'autenticazione con password in Spring Boot. Inoltre abbiamo anche imparato come gestire un utente in modo sicuro.</p><p>Grazie per aver letto questo articolo – spero ti sia stato d'aiuto. </p> ]]>
                </content:encoded>
            </item>
        
    </channel>
</rss>
