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 :

Spring security, Angular1.4, POST, CORS


Sujet :

Spring Java

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Décembre 2011
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 78
    Points : 45
    Points
    45
    Par défaut Spring security, Angular1.4, POST, CORS
    Bonjour à tous,

    j'ai un gros problème technique, je vous explique rapidement pas à pas pour être clair:

    Je n'arrivais pas à passer un bean contenant une liste depuis mon FrontEnd (Angular 1.4) vers mon BackEnd (sping 4, spring security)

    J'ai d'abord désactivé spring security et j'ai trouvé la solution que voici :

    Mon controller :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    @RequestMapping(value="/create/", method=RequestMethod.POST, consumes="application/json")
    	@ResponseBody
    	public StatusResponse create(@RequestBody EventsDTO events) throws TechnicalException {
    	return new StatusResponse();
    	}
    côté Angular :

    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
    var _queryPost = function(url, data, defData) {
     
                console.log('data : ', data);
     
                $http({
                  headers: {'Content-Type': 'application/json',
                            'Accept': 'application/json'},
                  method: 'POST',
                  url: url,
                  //params: data,
                  data: data,
                    withCredentials: true
                })
                  .success(function (data, status, headers, config) {
                    defData.$resolve(data);
                    $log.info(data);
                  })
                  .error(function (data, status, headers, config) {
                    $log.warn('*** DataProvider - query - error - status:' + status);
                    401 === status ? $location.path('/signIn') : $location.path('/error' + status);
                    defData.$reject(data);
                  });
     
                return defData;
            };

    sauf que lorsque je réactive spring-security j'obtiens une erreur 401 !

    Après de nombreuses recherches, j'ai cru comprendre que l'erreur se produit car j'envoie depuis angular un Content-Type avec la valeur "application/json"
    Or les règles CORS indiquent que celui-ci doit contenir la valeur : application/x-www-form-urlencoded ou d'autres que j'ai oubliées....en tout cas, pas "application/json"
    sauf que si je change la valeur du Content-type, ça passe mais j'obtiens une erreur 415 (logique car le controlleur attend un application/json)

    J'ai essayé pas mal de solutions trouvées sur le net en ajoutant par exemple des infos sur le header côté Angular mais rien n'y fait ....

    voici mes fichiers de config , web.xml:

    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
    39
    40
    41
    42
    43
    <!-- CORS related filter -->
        <filter>
            <filter-name>CORS</filter-name>
            <filter-class>
              org.eclipse.jetty.servlets.CrossOriginFilter
            </filter-class>
     
            <init-param>
                <param-name>allowedOrigins</param-name>
                <param-value>*</param-value>
            </init-param>
           <init-param>
                <param-name>allowedMethods</param-name>
                <param-value>GET,POST,DELETE,PUT,HEAD,OPTIONS</param-value>
            </init-param>
            <init-param>
                <param-name>allowedHeaders</param-name>
                <param-value>
                   origin, content-type, accept, authorization, 
                      x-requested-with, access-token, x-xsrf-token
                </param-value>
            </init-param>
            <init-param>
                <param-name>supportsCredentials</param-name>
                <param-value>true</param-value>
            </init-param>
        </filter>
     
        <filter-mapping>
            <filter-name>CORS</filter-name>
            <url-pattern>/*</url-pattern>
        </filter-mapping>
     
     
        <!-- Spring Security Filters -->
     	<filter>
    	   <filter-name>springSecurityFilterChain</filter-name>
    	   <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
    	</filter>
    	<filter-mapping>
       		<filter-name>springSecurityFilterChain</filter-name>
       		<url-pattern>/*</url-pattern>
    	</filter-mapping>

    spring security config :

    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
    39
    40
    <?xml version="1.0" encoding="UTF-8"?>
    <beans:beans xmlns="http://www.springframework.org/schema/security"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:beans="http://www.springframework.org/schema/beans"
        xsi:schemaLocation="
            http://www.springframework.org/schema/security
            http://www.springframework.org/schema/security/spring-security-3.2.xsd
            http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
            http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-2.0.xsd">
     
     	<http create-session="stateless" use-expressions="true" entry-point-ref="customAuthenticationEntryPoint">
    		<intercept-url pattern="/api/**" access="isAuthenticated()" />
    		<remember-me key="remember-me-security" services-ref="rememberMeServices" />
    		<form-login
    		    authentication-success-handler-ref="customAuthenticationSuccessHandler "
    		    authentication-failure-handler-ref="customAuthenticationFailureHandler " />
    		<logout success-handler-ref="customLogoutSuccessHandler"/>
     
    	</http>
     
    	<beans:bean id="rememberMeServices" class="org.springframework.security.web.authentication.rememberme.PersistentTokenBasedRememberMeServices">
        	<beans:property name="userDetailsService" ref="customUserDetailService"/>
        	<beans:property name="key" value="remember-me-security"/>
        	<beans:property name="cookieName" value="X-XSRF-TOKEN" />
        	<beans:property name="tokenValiditySeconds" value="3600" />
        	<!-- <property name="parameter" value="remember-me-parameter"/> -->
    	</beans:bean>
     
     	<authentication-manager alias="authenticationManager">
     		<authentication-provider user-service-ref="customUserDetailService">
      			<password-encoder hash="sha-256">
                	<!-- <salt-source user-property="nom"/> -->
            	</password-encoder>
     		</authentication-provider>
    	</authentication-manager> 
     
    	<global-method-security secured-annotations="enabled" pre-post-annotations="enabled"/>
     
    </beans:beans>

    Comment passer cet obstacle qui bloque tout mon travail ?? Merci d'avance

  2. #2
    Membre du Club
    Homme Profil pro
    Inscrit en
    Décembre 2011
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 78
    Points : 45
    Points
    45
    Par défaut
    Oyé oyé les amis !!!

    Il suffisait de rajouter
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <init-param>
        <param-name>chainPreflight</param-name>
        <param-value>false</param-value>
    </init-param>
    en gros ça configure le CrossOriginFilter qui gére les pré-requêtes de type OPTIONS

    Voilà !

  3. #3
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 937
    Points : 4 358
    Points
    4 358
    Par défaut
    Citation Envoyé par anakin59490 Voir le message
    sauf que lorsque je réactive spring-security j'obtiens une erreur 401 !
    ce qui signifie que l'utilisateur connecté ne peut accéder à ce service…
    cela ressemble plus à un problème de configuration de votre couche sécurité : quel utilisateur est autorisé à faire quoi.

    (Par ailleurs des méthodes "@RequestMapping/@ResponseBody" qui font des "throws Exception" : beurk)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Spring Security] implementer son propre UserDetailService
    Par santati dans le forum Spring Web
    Réponses: 0
    Dernier message: 14/01/2009, 10h34
  2. [Spring Security] question concernant un filtre d'ACEGI
    Par flamant dans le forum Spring Web
    Réponses: 2
    Dernier message: 22/10/2008, 07h37
  3. [Security] Spring security VS JAAS
    Par Sniper37 dans le forum Spring
    Réponses: 2
    Dernier message: 21/08/2008, 16h54
  4. [Spring Security] Authentification par groupe LDAP
    Par titeuf92 dans le forum Spring Web
    Réponses: 2
    Dernier message: 25/06/2008, 10h28

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