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.

