Skip to content

0.05_Security

Giuliano Ranauro edited this page Dec 3, 2024 · 1 revision

Security - Spring security con persistenza

Definizione classe User

Stiamo attenti a taggare correttamente i campi e la classe.

import javax.persistence.Entity;
import javax.persistence.Id;

@Entity
public class User {
  @Id
  private String username;
  private String password;
  private String role;

  // Getters and setters
}

Definizione Repository User

import org.springframework.data.jpa.repository.JpaRepository;

public interface UserRepository extends JpaRepository<User, String> {
  User findByUsername(String username);
}

Definizione Servizio User

@Service
public class CustomUserDetailsService implements UserDetailsService {

  @Autowired
  private UserRepository userRepository;

  @Override
  public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
    User user = userRepository.findByUsername(username);
    if (user == null) {
      throw new UsernameNotFoundException("User not found");
    }
    return User.withUsername(user.getUsername())
               .password(user.getPassword())
               .roles(user.getRole())
               .build();
  }
}

Attenzione: il servizio implementa UserDetailsService; questa interfaccia richiede l'implementazione del metodo loadUserByUsername(String username) che verrà usata successivamente da SecurityConfig per caricare gli user e controllarne i valori.

In poche parole se la vede tutta VaadinWebSecurity ma noi dobbiamo implementare il metodo.

Definizione SecurityConfig

Nel package security creiamo la classe:

@EnableWebSecurity
@EnableMethodSecurity(jsr250Enabled = true)
@Configuration
public class SecurityConfig extends VaadinWebSecurity {

  @Autowired
  private CustomUserDetailsService customUserDetailsService;

  @Override
  protected void configure(HttpSecurity http) throws Exception {
    super.configure(http);
    setLoginView(http, LoginView.class);
  }

  @Bean
  @Override
  public UserDetailsService userDetailsService() {
    return customUserDetailsService;
  }
}

La magia è fatta dal metodo sovrascritto userDetailsService che utilizza il servizio CustomUserDetailsService appena creato per recuperare le informazioni degli utenti dal database.

Clone this wiki locally