Java Secure Coding
proteggere le tue API REST con Spring Security 🚀


Tabella dei Contenuti
Nel mondo dello sviluppo back-end, la sicurezza non è più un optional. Con l’aumento delle minacce informatiche, è fondamentale progettare API robuste e sicure. In questo articolo, esploreremo come proteggere le tue API REST utilizzando Spring Security, con esempi pratici e codice.
Perché la sicurezza è fondamentale
Le API REST sono spesso il punto di accesso principale per applicazioni web e mobile. Senza adeguate misure di sicurezza, possono diventare vulnerabili ad attacchi come:
Injection: inserimento di codice malevolo attraverso input non validati.
Cross-Site Request Forgery (CSRF): esecuzione di azioni non autorizzate da parte di utenti autenticati.
Accesso non autorizzato: utenti che accedono a risorse senza i permessi necessari.
Spring Security offre un framework completo per affrontare queste sfide, integrandosi perfettamente con Spring Boot.
@Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.csrf().disable() .authorizeRequests() .antMatchers("/api/public/**").permitAll() .anyRequest().authenticated(); } }
In questo esempio:
Disabilitiamo CSRF, poiché le API REST non mantengono lo stato.
Definiamo endpoint pubblici e protetti.
Utilizziamo l’autenticazione Basic per semplicità.
Gestione degli utenti
Per gestire gli utenti e i ruoli, possiamo definire un UserDetailsService
personalizzato:
@Service public class CustomUserDetailsService implements UserDetailsService { @Autowired private UserRepository userRepository; // Interfaccia per accedere al database @Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { User user = userRepository.findByUsername(username) .orElseThrow(() -> new UsernameNotFoundException("User not found")); return new org.springframework.security.core.userdetails.User( user.getUsername(), user.getPassword(), getAuthorities(user) ); } private Collection extends GrantedAuthority> getAuthorities(User user) { return Collections.singletonList(new SimpleGrantedAuthority("ROLE_" + user.getRole())); } }
Questo servizio recupera le informazioni dell’utente dal database e assegna i ruoli appropriati.
Proteggere le password
È fondamentale non memorizzare le password in chiaro. Utilizziamo BCryptPasswordEncoder
per crittografare le password:
@Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); }
Durante la registrazione di un nuovo utente:
User user = new User(); user.setUsername("johndoe"); user.setPassword(passwordEncoder.encode("password123")); userRepository.save(user);
Autenticazione con JWT
Per un approccio stateless, possiamo utilizzare JSON Web Tokens (JWT). Dopo l’autenticazione, generiamo un token JWT che il client utilizzerà per le richieste successive.
Esempio di generazione del token:
String token = Jwts.builder() .setSubject(user.getUsername()) .setIssuedAt(new Date()) .setExpiration(new Date(System.currentTimeMillis() + 864_000_00)) // 1 giorno .signWith(SignatureAlgorithm.HS512, "SecretKey") .compact();
Il token viene poi inviato al client, che lo include nell’header Authorization
delle richieste:
Authorization: Bearer < token >
Vuoi scoprire come sfruttare al meglio le potenzialità di Java Secure Coding per i tuoi progetti? Partecipa ai nostri corsi di formazione su misura. Prenota il tuo corso oggi stesso su formazione.jdk.it e inizia il tuo percorso verso il successo nello sviluppo software.