Spring Конфигурация безопасности @Не удается создать уникальное исключение

Я пытался зарегистрировать несколько фильтров в своей конфигурации Spring Security, однако всегда получаю одно и то же исключение:

04-Nov-2015 14: 35: 23.792 ВНИМАНИЕ [Соединение RMI TCP (3) -127.0.0.1] org.springframework.web.context.support.AnnotationConfigWebApplicationContext.refresh Исключительная ситуация при инициализации контекста - отмена попытка обновления org.springframework.beans.factory.BeanCreationException: ошибка создание бина с именем 'Org.springframework.security.config.annotation.web.configuration.WebSecurityConfiguration': Инъекция автосвязанных зависимостей не удалась; вложенное исключение java.lang.IllegalStateException: @Order на WebSecurityConfigurers должен быть уникальный. Порядок 100 уже использовался, поэтому его нельзя использовать на com.payment21.webapp.MultiHttpSecurityConfig$ApiW[email protected]1d381684 тоже.

Поскольку мои собственные попытки не сработали, я попробовал точно такой же код, как показано в справочнике Spring Security:

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

Чтобы изолировать ошибку, я попытался заменить web.xml на подход, основанный на Java, но он тоже не сработал. Я понятия не имею, что не так, док не так? Может в моем приложении что-то путать с настройкой? Система запускается правильно, если я не зарегистрирую второй WebSecurityConfigAdapter.

Это мои зависимости:

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'

Ответ 1

Я нашел ошибку... никто никогда не публикует импорт в фрагментах. Мы используем настройку нескольких модулей, и IntelliJ не распознает аннотации Spring и не использует

org.apache.logging.log4j.core.config.Order

вместо

org.springframework.core.annotation.Order

Поскольку Spring не анализировал правильные аннотации, он принимал значение по умолчанию 100 для обеих конфигураций.

Ответ 2

Возможно, стоит отметить, что аннотация @Order должна быть на уровне класса. Это немного запутанно, так как конфигурация @Journeycorner - это многоклассовый пример. Мой пример с импортом:)

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

}

Ответ 3

Обычно это исключение возникает, когда один и тот же компонент разрешается дважды. Например, если файл @Configuration импортирует файл applicationContext.xml, который разрешает один и тот же компонент, при запуске приложения дважды пытается зарегистрировать его (в вашем случае MultiHttpSecurityConfig), и вы получаете эту ошибку.

Я исправил ошибку, удалив определение компонента из XML.

Ответ 4

Возможно, вы аннотировали другой класс аннотацией @EnableWebSecurity. Помните, что только один класс может реализовать эту аннотацию. Надеюсь, что это поможет!

Ответ 5

Помещение @Order (1000) во второй WebSecurityConfigurerAdapter сработало для меня

Ответ 6

Возможно, вы аннотировали другой класс аннотацией @EnableWebSecurity. Помните, что только один класс может реализовать эту аннотацию. Надеюсь, это поможет!

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

    }
}

Ответ 7

Недавно я столкнулся с той же проблемой, но нигде не смог найти ответ, чтобы указать мне правильное направление. В итоге я повторил свои шаги в истории git и обнаружил, что единственное изменение - добавление аннотации @RefreshScope в мой класс.

Удалив аннотацию @RefreshScope, мое приложение заработало.

Ответ 8

Возможно, у вас есть конфигурация с аннотацией @order(100) где-то в вашей конфигурации spring. попробуйте удалить аннотацию @order(100) или указать другое значение заказа.

Ответ 9

У меня была та же проблема, и я решил эту ошибку перемещать аннотацию @Configuration на уровень класса.

@Configuration
public class SecurityConfiguration extends WebSecurityConfigurerAdapter { 

Ответ 10

Моя проблема была решена, когда я добавил это описание в конфигурацию безопасности:

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

Ответ 11

Это связано с тем, что безопасность Spring использует WebSecurityConfigurerAdapter под капотом, а этот адаптер использует order (100), поэтому spring не разрешит дублирование последовательности заказов.

Ответ 12

В моем случае я поместил аннотацию @EnableOAuth2Sso в класс, аннотированный @SpringBootApplication, но у меня также был отдельный класс, расширяющий WebSecurityConfigurerAdapter. Как сказано в документации @EnableOAuth2Sso:

Если существует существующий WebSecurityConfigurerAdapter, предоставленный пользователем и помеченный @EnableOAuth2Sso, он расширяется путем добавления фильтра аутентификации и точки входа аутентификации. Если у пользователя есть только @EnableOAuth2Sso, но нет в WebSecurityConfigurerAdapter , то добавляется один со всеми защищенными путями.

Поскольку был добавлен адаптер по умолчанию, я получил два, что вызвало исключение.
Конечно, решение состояло в том, чтобы переместить аннотацию @EnableOAuth2Sso в класс, который расширил WebSecurityConfigurerAdapter.