1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
|
package com.alten.assistantnc.configuration.rest;
*
import java.util.Arrays;
*
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Import;
import org.springframework.security.authentication.AuthenticationProvider;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.web.SecurityFilterChain;
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.CorsConfigurationSource;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
*
import com.alten.assistantnc.configuration.service.ConfigurationAssistantNCConfigurationService;
import com.alten.assistantnc.security.AuthenticationProviderImpl;
import com.alten.assistantnc.security.JWTAuthorizationFilter;
import com.alten.assistantnc.security.JWTManagement;
import com.alten.assistantnc.security.JWTManagementImpl;
import com.alten.assistantnc.security.SecurityConstant;
*
@ComponentScan("com.alten.assistantnc.rest")
@Import(ConfigurationAssistantNCConfigurationService.class)
@EnableGlobalMethodSecurity(
prePostEnabled = true,
securedEnabled = true,
jsr250Enabled = true)
public class ConfigurationAssistantNCRest implements WebMvcConfigurer{
*
@Value("${client}")
private String client; //Ici, j'injecte le client pour dire qu'au niveau du CORS, je n'authorise pas n'importe quoi.
*
@Autowired
private UserDetailsService userService;
*
@Bean
public AuthenticationProvider authenticationProvider() {
return new AuthenticationProviderImpl(userService);//Je réimplémente l'AuthenticationProvider de Spring pour utiliser mon propre service qui tape soit dans ma propre BDD, soit éventuellement dans un LDAP
}
*
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {//Chaine pour décrire le merdier à Spring security
return http
.authenticationProvider(authenticationProvider()) //On injecte son propre Provider qui sera utilisé par Spring
.cors().configurationSource(corsConfigurationSource()) //Configuration du CORS
.and()
.authorizeHttpRequests() //Ici on va expliquer à Spring que les service de login peuvent être appelé par tous le monde.
.antMatchers("/login/log").permitAll()
.antMatchers("/login/logout").permitAll() //En fait, cette ligne est inutile. Côté client, il suffit de nettoyer le JWT.
.and()
.authorizeHttpRequests().anyRequest().authenticated() //Pour le reste, il faut un jeton
.and()
.csrf().disable() //Un autre mécanisme de sécurité à désactiver.
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and()
.addFilterBefore(new JWTAuthorizationFilter(), UsernamePasswordAuthenticationFilter.class) //Ici, on écrit un filtre qui va traité avant appel de service tous les JWT
.build();
}
*
@Bean
public CorsConfigurationSource corsConfigurationSource() { //La configuration du CORS
CorsConfiguration configuration = new CorsConfiguration();
configuration.setAllowedMethods(Arrays.asList("GET","POST"));
configuration.applyPermitDefaultValues();
configuration.addAllowedOrigin(client);
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", configuration);
*
return source;
}
*
@Bean
public JWTManagement jwtManagement() { //Une classe pour gérer les JWT de l'application
return new JWTManagementImpl();
}
} |
Partager