web-dev-qa-db-fra.com

Spring Security Configuration @Order pas d'exception unique

J'ai essayé d'enregistrer plusieurs filtres dans ma configuration de sécurité Spring, mais j'ai toujours la même exception:

04-Nov-2015 14: 35: 23.792 AVERTISSEMENT [RMI TCP Connection (3) -127.0.0.1] org.springframework.web.context.support.AnnotationConfigWebApplicationContext.refresh Exception rencontrée lors de l'initialisation du contexte - annulation tentative de rafraîchissement org.springframework.beans.factory.BeanCreationException: Erreur création d'un haricot avec name 'org.springframework.security.config.annotation.web.configuration.WebSecurityConfiguration': L'injection de dépendances câblées automatiquement a échoué; exception imbriquée est Java.lang.IllegalStateException: @Order sur WebSecurityConfigurers doit être unique. Une commande de 100 a déjà été utilisée, elle ne peut donc pas être utilisée sur com.payment21.webapp.MultiHttpSecurityConfig$ApiWebSecurityConfigurationAdapter$$EnhancerBySpringCGLIB$35c79fe4@1d381684 aussi.

Comme mes propres tentatives n'ont pas fonctionné, j'ai essayé le code identique comme indiqué dans la référence de sécurité Spring :

@EnableWebSecurity
public class MultiHttpSecurityConfig {
    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) { 
        auth
            .inMemoryAuthentication()
                .withUser("user").password("password").roles("USER").and()
                .withUser("admin").password("password").roles("USER", "ADMIN");
    }

    @Configuration
    @Order(1)                                                        
    public static class ApiWebSecurityConfigurationAdapter extends WebSecurityConfigurerAdapter {
        protected void configure(HttpSecurity http) throws Exception {
            http
                .antMatcher("/api/**")                               
                .authorizeRequests()
                    .anyRequest().hasRole("ADMIN")
                    .and()
                .httpBasic();
        }
    }

    @Configuration                                                   
    public static class FormLoginWebSecurityConfigurerAdapter extends WebSecurityConfigurerAdapter {

        @Override
        protected void configure(HttpSecurity http) throws Exception {
            http
                .authorizeRequests()
                    .anyRequest().authenticated()
                    .and()
                .formLogin();
        }
    }
}

Pour isoler l'erreur, j'ai essayé de remplacer le fichier web.xml par une approche basée sur Java, mais cela ne fonctionnait pas non plus. Je n'ai aucune idée de ce qui ne va pas, est-ce que le doc est faux? Est-ce que quelque chose dans mon application peut gâcher la configuration? Le système démarre correctement, sauf si j'enregistre un second WebSecurityConfigAdapter.

Ce sont mes dépendances:

compile 'org.springframework:spring-webmvc:4.2.2.RELEASE'
compile 'org.springframework:spring-messaging:4.2.2.RELEASE'
compile 'org.springframework:spring-websocket:4.2.2.RELEASE'
compile 'org.springframework:spring-aop:4.2.2.RELEASE'
compile'javax.servlet:javax.servlet-api:3.0.1'
compile 'org.springframework.security:spring-security-web:4.0.3.RELEASE'
compile 'org.springframework.security:spring-security-config:4.0.3.RELEASE'
13
Journeycorner

J'ai trouvé l'erreur ... personne n'a jamais importé d'extraits dans des extraits. Nous utilisons une configuration de projet multi-module et IntelliJ n'a pas reconnu les annotations Spring et a utilisé 

org.Apache.logging.log4j.core.config.Order 

au lieu de 

org.springframework.core.annotation.Order

Étant donné que Spring n'a pas analysé les annotations correctes, la valeur par défaut 100 était utilisée pour les deux configurations.

6
Journeycorner

Il convient de noter que l'annotation @Order devrait se situer au niveau de la classe. C'est un peu déroutant puisque la configuration de @Journeycorner est un exemple multiclass. Mon exemple avec les importations :)

import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.context.annotation.Configuration;
import org.springframework.core.annotation.Order;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
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 com.someco.entity.User;
import com.someco.service.SpringDataJpaUserDetailsService;

@Configuration("CustomSecurityConfig")
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
@Order(1000)                                                        
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

@Autowired
private SpringDataJpaUserDetailsService userDetailsService;

@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
    auth
        .userDetailsService(this.userDetailsService)
            .passwordEncoder(User.PASSWORD_ENCODER);
}

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
        .authorizeRequests()
            .antMatchers("/built/**", "/main.css").permitAll()
            .anyRequest().authenticated()
            .and()
        .formLogin()
            .defaultSuccessUrl("/", true)
            .permitAll()
            .and()
        .httpBasic()
            .and()
        .csrf().disable()
        .logout()
            .logoutSuccessUrl("/");
}

}
12
Paul Lungu

Généralement, cette exception se produit lorsque le même bean est résolu deux fois. Par exemple, si un fichier @Configuration importe un applicationContext.xml qui résout le même bean, lorsque l'application démarre, essayez de l'enregistrer (dans votre cas, MultiHttpSecurityConfig) deux fois et vous obtenez cette erreur.

J'ai résolu le problème en supprimant la définition du bean du XML.

5
A. Saladino

Peut-être avez-vous annoté une autre classe avec l'annotation @EnableWebSecurity . Sachez que seule une classe peut implémenter cette annotation. J'espère que ça va aider!

3
Guchelkaben

Peut-être avez-vous annoté une autre classe avec l'annotation @EnableWebSecurity. Sachez que seule une classe peut implémenter cette annotation. J'espère que ça va aider!

package com.ie.springboot.configuaration;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.annotation.Order;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
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;
@Configuration
@EnableWebSecurity
public class SpringSecurityConfig extends WebSecurityConfigurerAdapter {
    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication().withUser("mkyong").password("123456").roles("USER");
        auth.inMemoryAuthentication().withUser("admin").password("{noop}123456").roles("ADMIN");
        auth.inMemoryAuthentication().withUser("dba").password("123456").roles("DBA");

    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {

        http.authorizeRequests()
                .antMatchers("/admin/**").access("hasRole('ROLE_ADMIN')")
                .antMatchers("/*").access("hasRole('ROLE_ADMIN') or hasRole('ROLE_DBA')")
                .and().formLogin();
        http.csrf().disable();

    }
}
1

J'ai récemment rencontré le même problème mais je n'ai pas pu trouver de réponse nulle part pour me diriger dans la bonne direction. J'ai fini par revenir en arrière dans l'historique de git pour constater que le seul changement apporté était l'ajout de l'annotation @RefreshScope à ma classe.

En supprimant l'annotation @RefreshScope, mon application a fonctionné.

1
George Davies

Mon problème a été résolu lorsque j'ai ajouté cette description à la configuration de sécurité:

@Configuration("MySecurityConfig")
public class MySecurityConfig extends WebSecurityConfigurerAdapter
0
Arun

J'ai eu le même problème et j'ai résolu cette erreur en déplaçant l'annotation @Configuration au niveau de la classe.

@Configuration
public class SecurityConfiguration extends WebSecurityConfigurerAdapter { 
0
Sampath T

Mettre @Order (1000) sur le second WebSecurityConfigurerAdapter a fonctionné pour moi

0
Deepak Kumar

Vous pourriez avoir une configuration avec l'annotation @order(100) quelque part dans votre configuration de ressort. essayez de supprimer l'annotation @order(100) ou donnez une autre valeur d'ordre.

0
Imrank