it-swarm.com.de

Spring Security Configuration @Order keine eindeutige Ausnahme

Ich habe versucht, mehrere Filter in meiner Spring Security-Konfiguration zu registrieren. Ich bekomme jedoch immer die gleiche Ausnahme:

04-Nov-2015 14: 35: 23.792 WARNUNG [Verbindung mit RMI TCP (3) -127.0.0.1] org.springframework.web.context.support.AnnotationConfigWebApplicationContext.refresh Während der Kontextinitialisierung aufgetretene Ausnahme - Abbruch von Aktualisierungsversuch org.springframework.beans.factory.BeanCreationException: Fehler Bean mit Namen erstellen 'org.springframework.security.config.annotation.web.configuration.WebSecurityConfiguration': Die Injektion von autowired Abhängigkeiten ist fehlgeschlagen. geschachtelte Ausnahme ist Java.lang.IllegalStateException: @Order für WebSecurityConfigurers muss einzigartig sein. Order of 100 wurde bereits verwendet, daher kann sie nicht für .__ verwendet werden. com.payment21.webapp.MultiHttpSecurityConfig$ApiW[email protected]1d381684 auch.

Da meine eigenen Versuche nicht funktionierten, habe ich den exakt gleichen Code wie in der Spring Security-Referenz gezeigt ausprobiert: _:

@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();
        }
    }
}

Um den Fehler einzugrenzen, habe ich versucht, die web.xml durch einen Java-basierten Ansatz zu ersetzen, der jedoch nicht funktionierte. Ich habe keine Ahnung, was falsch ist, ist das Dokument falsch? Kann etwas in meiner Anwendung mit der Konfiguration durcheinander kommen? Das System wird ordnungsgemäß gestartet, es sei denn, ich registriere einen zweiten WebSecurityConfigAdapter.

Das sind meine Abhängigkeiten:

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

Ich habe den Fehler gefunden ... niemand hat Importe in Snippets veröffentlicht. Wir verwenden ein Multi-Modul-Projekt-Setup und IntelliJ hat die Spring-Anmerkungen nicht erkannt und verwendet 

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

anstatt 

org.springframework.core.annotation.Order

Da Spring die korrekten Anmerkungen nicht analysiert hat, wurde für beide Konfigurationen der Standardwert 100 angenommen.

6
Journeycorner

Die Anmerkung @Order sollte sich auf Klassenebene befinden. Dies ist etwas verwirrend, da die Konfiguration von @Journeycorner ein Beispiel für mehrere Klassen ist. Mein Beispiel mit Importen :)

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

Normalerweise tritt diese Ausnahme auf, wenn dieselbe Bean zweimal aufgelöst wird. Wenn beispielsweise eine @Configuration-Datei eine applicationContext.xml importiert, die dasselbe Bean auflöst, versucht die Anwendung beim Start der Anwendung, sie zweimal zu registrieren (in Ihrem Fall MultiHttpSecurityConfig), und Sie erhalten diesen Fehler.

Ich habe den Fehler beim Entfernen der Bean-Definition aus der XML-Datei behoben.

5
A. Saladino

Möglicherweise haben Sie eine andere Klasse mit der Annotation @EnableWebSecurity versehen. Beachten Sie, dass nur eine Klasse diese Annotation implementieren kann. Hoffe das wird helfen!

3
Guchelkaben

Möglicherweise haben Sie eine andere Klasse mit der Annotation @EnableWebSecurity versehen. Beachten Sie, dass nur eine Klasse diese Annotation implementieren kann. Hoffe das wird helfen!

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

Ich war vor kurzem mit dem gleichen Problem konfrontiert, konnte aber nirgendwo eine Antwort finden, um mich in die richtige Richtung zu weisen. Am Ende habe ich meine Schritte durch die Git-Historie zurückverfolgt und festgestellt, dass die einzige Änderung darin bestand, @RefreshScope-Annotation zu meiner Klasse hinzuzufügen.

Durch das Entfernen der Annotation @RefreshScope funktionierte meine Anwendung.

1
George Davies

Mein Problem wurde behoben, als ich diese Beschreibung zur Sicherheitskonfiguration hinzufügte:

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

Ich hatte das gleiche Problem und ich habe diesen Fehler behoben, der @Configuration-Annotation auf Klassenebene verschob.

@Configuration
public class SecurityConfiguration extends WebSecurityConfigurerAdapter { 
0
Sampath T

Das Aufsetzen von @Order (1000) auf den zweiten WebSecurityConfigurerAdapter hat für mich funktioniert

0
Deepak Kumar

Möglicherweise befindet sich in Ihrer Federkonfiguration eine Konfiguration mit @order(100)-Annotation. Entfernen Sie die Annotation @order(100) oder geben Sie einen anderen Auftragswert an.

0
Imrank

Dies liegt daran, dass die Sicherheit von Spring WebSecurityConfigurerAdapter unter der Haube verwendet und dieser Adapter order (100) verwendet. Daher lässt spring keine doppelte Reihenfolge zu.

0
rogue lad