IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Spring Java Discussion :

Probleme de crossorigine avec Spring Boot Sécurity


Sujet :

Spring Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    En reconversion
    Inscrit en
    Mai 2006
    Messages
    509
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : En reconversion

    Informations forums :
    Inscription : Mai 2006
    Messages : 509
    Par défaut Probleme de crossorigine avec Spring Boot Sécurity
    Bonjour à tous,

    J'ai un soucis de @CrossOrigin avec Sprig Boot sécurity.
    Ce que j'ai dans mon code pour l'instant ne fonctionne pas, malgré mes recherche sur le sujet.

    Dans mon pom.xml:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-security</artifactId>
    </dependency>

    Ma class d'API REST:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    public class ApiTempController {
        @Autowired
        private ApiTempJoin apiTempJoins;
    //    @Autowired
    //    private ApiGetDay apiGetDay;
        @GetMapping("api/last24")
        @CrossOrigin("*")
        public Iterable<ApiTempJoin> dataLast24(){
            return apiTempJoins.findByIdInvOrderLast24Temp();
        }
     
        @GetMapping("api/{day}")
        @CrossOrigin("*")
        public Iterable<ApiTempJoin> data1day(@PathVariable String day){
            return apiTempJoins.findByDay(day);
        }
     
        @PostMapping(value = "/api/getDay", consumes = {"application/json"})
        @CrossOrigin("*")
        public ApiGetDay getDay(@RequestBody ApiGetDay apiGetDay){
        String  oneDay = apiGetDay.getGetDay();
        System.out.println(oneDay);
        data1day(oneDay);
        return apiGetDay;
    }
    }
    Ma class gèrant la sécurité:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    package fr.synergy.projet_THP.controlers.security;
     
    import org.springframework.context.annotation.Bean;
    import org.springframework.security.config.annotation.web.builders.HttpSecurity;
    import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
    import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
    import org.springframework.security.core.userdetails.User;
    import org.springframework.security.core.userdetails.UserDetails;
    import org.springframework.security.core.userdetails.UserDetailsService;
    import org.springframework.security.provisioning.InMemoryUserDetailsManager;
     
     
    @EnableWebSecurity
    public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
        public void configure (HttpSecurity http) throws Exception{
     
            http.cors().and().authorizeHttpRequests((requests) -> requests
                            .antMatchers("/admin", "/admin/index").permitAll()
                            .anyRequest().authenticated()
                    );
            http.cors().and().formLogin((form) -> form
                            .loginPage("/login")
                            .permitAll()
                    )
                    .logout((logout) -> logout.permitAll());
        }
        @Bean
        public UserDetailsService userDetailsService() {
            UserDetails user =
                    User.withDefaultPasswordEncoder()
                            .username("user")
                            .password("pwd")
                            .roles("USER")
                            .build();
     
            return new InMemoryUserDetailsManager(user);
        }
    }
    Voila je pense que j'ai mis le principale, je fait encore des essaies, mais pour l'instant, rien ne fonctionne.
    Donc, si quelqu'un de vous a une solution?
    Merci d'avance

  2. #2
    Membre très actif

    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    486
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 486
    Billets dans le blog
    5
    Par défaut
    Bonjour,

    Il faudrait donner l'erreur, pour que l'on puisse t'aider.

    Pour ma part, j'ai du dernièrement me confronter à Spring Security, et j'ai du implémenter un scénario précis.

    https://www.developpez.net/forums/d2.../#post11875369

    Je l'ai fait par jeton JWT.

    Et il y a toujours le CORS qui emmerde son monde.
    On peut le configurer de la façon suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    @Bean
    	public CorsConfigurationSource corsConfigurationSource() {
    		CorsConfiguration configuration = new CorsConfiguration();
    		configuration.setAllowedMethods(Arrays.asList("GET","POST"));
    		configuration.applyPermitDefaultValues();
    		configuration.addAllowedOrigin(client);
    		UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
    		source.registerCorsConfiguration("/**", configuration);
    *
    		return source;
    	}
    Ici, on passe clairement en paramètre le client autorisé (par exemple http://localhost:4200). Mais si on est multiclient, comme mon projet, on a vite des problèmes.

    On peut aussi admettre tous clients, soit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    @Bean("corsConfigurationSource")
    	public CorsConfigurationSource getCorsConfigurationSource() {
    		CorsConfiguration configuration = new CorsConfiguration();
    		configuration.setAllowedMethods(Arrays.asList("GET","POST"));
    		configuration.applyPermitDefaultValues();
    		configuration.addAllowedOrigin("*");
    		UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
    		source.registerCorsConfiguration("/**", configuration);
    		return source;
    	}
    Cordialement.

  3. #3
    Membre éclairé
    Homme Profil pro
    En reconversion
    Inscrit en
    Mai 2006
    Messages
    509
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : En reconversion

    Informations forums :
    Inscription : Mai 2006
    Messages : 509
    Par défaut
    Bonjour et merci PhilippeGibault,

    Je vais essayer de regarder avec ce que tu m'a donné, mais ça me parait un cheminement complexe.

    Par contre comment tu utilise:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    @Bean
    	public CorsConfigurationSource corsConfigurationSource() {
    		CorsConfiguration configuration = new CorsConfiguration();
    		configuration.setAllowedMethods(Arrays.asList("GET","POST"));
    		configuration.applyPermitDefaultValues();
    		configuration.addAllowedOrigin(client);
    		UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
    		source.registerCorsConfiguration("/**", configuration);
    *
    		return source;
    Tu le mets juste dans la classe gérant la sécurité?
    Il doit y avoir un appel de cette fonction?


    Sinon désolé voici l'erreur:
    La première et sans importance, elle est du a l'utilisation de la bibliothèque Chart.js, mais cela fonctionne même avec l'erreur.

    Nom : Screenshot_14.png
Affichages : 1167
Taille : 222,1 Ko

  4. #4
    Membre très actif

    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    486
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 486
    Billets dans le blog
    5
    Par défaut
    C'est effectivement le CORS.

    Et c'est effectivement un truc qui emmerde tous le monde.

    En gros, ce qu'il te dit, c'est que celui qui appelle ton service REST (en l'occurrence par exemple http://localhost:4200 si tu développes avec Angular) n'est pas au même endroit que ton serveur Java Spring (exemple http://localhost:8080).

    Le CORS te dit donc que comme ce n'est pas la même origine, il refuse de donner suite à la requête.

    Tu peux permettre toutes origines de la façon suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    configuration.addAllowedOrigin("*");
    Ou alors rester dans la logique du je n'ai qu'un seul client:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    configuration.addAllowedOrigin(client);
    Et passer en paramètre ton client comme http://localhost:4200 (Si angular).

  5. #5
    Membre très actif

    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    486
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 486
    Billets dans le blog
    5
    Par défaut
    Et le but de code est en fait dans la classe de configuration de Spring Boot.

  6. #6
    Membre très actif

    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    486
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 486
    Billets dans le blog
    5
    Par défaut
    Pour être exact, le @Bean définit un bean pour le contexte Spring. Et j'injecte ce bean dans le filtre Spring security:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    @Bean
    	public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
    			return http
    				.authenticationProvider(authenticationProvider())
    				.cors().configurationSource(corsConfigurationSource())
    				.and()
    				.authorizeHttpRequests()
    					.antMatchers("/login/log").permitAll()
    					.antMatchers("/login/logout").permitAll()
    				.and()
    				.authorizeHttpRequests().anyRequest().authenticated()
    				.and()
    				.csrf().disable()	
    				.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
    				.and()
    				.addFilterBefore(new JWTAuthorizationFilter(), UsernamePasswordAuthenticationFilter.class)
    				.build();
    	}

Discussions similaires

  1. Réponses: 7
    Dernier message: 02/12/2018, 10h28
  2. Réponses: 2
    Dernier message: 20/04/2011, 21h48
  3. Probleme de session avec spring MVC et tomcat
    Par jalalos dans le forum Spring Web
    Réponses: 0
    Dernier message: 13/08/2009, 11h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo