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
.