[SPRING] 스프링 보안 설정 @ 유일 예외가 아니다.
SPRING스프링 보안 설정 @ 유일 예외가 아니다.
스프링 보안 구성에 여러 필터를 등록하려고 시도했지만 항상 같은 예외가 발생합니다.
내 자신의 시도가 효과가 없었기 때문에 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();
}
}
}
오류를 분리하기 위해 Java 기반 접근 방식으로 web.xml을 대체하려고 시도했지만 작동하지 않았습니다. 무슨 일이 잘못된 건지 모르겠지만, 문서가 잘못 됐나요? 내 응용 프로그램의 구성이 엉망이 될 수 있습니까? 두 번째 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.@Order 주석은 클래스 수준에 있어야합니다. @Journeycorner 구성이 여러 가지 예제이므로 약간 혼란 스럽습니다. 수입에 대한 나의 예 :)
@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("/"); } }
-
==============================
2.오류를 발견했습니다 ... 아무도 스 니펫에 가져 오기를 게시하지 않습니다. 우리는 다중 모듈 프로젝트 설정을 사용하고 있으며 IntelliJ는 Spring 주석을 인식하지 못하고 사용했습니다.
오류를 발견했습니다 ... 아무도 스 니펫에 가져 오기를 게시하지 않습니다. 우리는 다중 모듈 프로젝트 설정을 사용하고 있으며 IntelliJ는 Spring 주석을 인식하지 못하고 사용했습니다.
대신에
Spring은 올바른 주석을 구문 분석하지 않았기 때문에 두 구성에 대해 기본값 100을 가정했습니다.
-
==============================
3.보통,이 예외는 동일한 빈이 두 번 해결 될 때 발생합니다. 예를 들어 @Configuration 파일이 동일한 빈을 해석하는 applicationContext.xml을 가져 오면 응용 프로그램이 시작할 때 (해당 경우 MultiHttpSecurityConfig) 두 번 등록하려고하면이 오류가 발생합니다.
보통,이 예외는 동일한 빈이 두 번 해결 될 때 발생합니다. 예를 들어 @Configuration 파일이 동일한 빈을 해석하는 applicationContext.xml을 가져 오면 응용 프로그램이 시작할 때 (해당 경우 MultiHttpSecurityConfig) 두 번 등록하려고하면이 오류가 발생합니다.
XML에서 빈 정의를 제거하는 중 오류를 해결했습니다.
-
==============================
4.아마 다른 클래스에 @EnableWebSecurity 주석을 달았을 수도 있습니다. 이 주석을 구현할 수있는 클래스는 단 하나 뿐이라는 점에 유의하십시오. 희망이 도움이 될 것입니다!
아마 다른 클래스에 @EnableWebSecurity 주석을 달았을 수도 있습니다. 이 주석을 구현할 수있는 클래스는 단 하나 뿐이라는 점에 유의하십시오. 희망이 도움이 될 것입니다!
-
==============================
5.아마 다른 클래스에 @EnableWebSecurity 주석을 달았을 수도 있습니다. 이 주석을 구현할 수있는 클래스는 단 하나 뿐이라는 점에 유의하십시오. 희망이 도움이 될 것입니다!
아마 다른 클래스에 @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(); } }
-
==============================
6.최근에 같은 문제가 발생했지만 올바른 방향으로 나를 가리켜 줄 답변을 찾을 수 없었습니다. 결국 변경된 사항은 @RefreshScope 주석을 내 클래스에 추가하는 것 뿐이었다.
최근에 같은 문제가 발생했지만 올바른 방향으로 나를 가리켜 줄 답변을 찾을 수 없었습니다. 결국 변경된 사항은 @RefreshScope 주석을 내 클래스에 추가하는 것 뿐이었다.
@RefreshScope 주석을 제거함으로써 응용 프로그램이 작동했습니다.
-
==============================
7.두 번째 WebSecurityConfigurerAdapter에 @Order (1000)를 두어 나를 위해 일했습니다.
두 번째 WebSecurityConfigurerAdapter에 @Order (1000)를 두어 나를 위해 일했습니다.
-
==============================
8.스프링 구성의 어딘가에 @order (100) 주석을 사용하는 구성이있을 수 있습니다. @order (100) 주석을 제거하거나 다른 순서 값을 지정하십시오.
스프링 구성의 어딘가에 @order (100) 주석을 사용하는 구성이있을 수 있습니다. @order (100) 주석을 제거하거나 다른 순서 값을 지정하십시오.
-
==============================
9.나는 같은 문제가 있었고 @Configuration 어노테이션을 클래스 레벨로 옮기는이 오류를 해결했다.
나는 같은 문제가 있었고 @Configuration 어노테이션을 클래스 레벨로 옮기는이 오류를 해결했다.
@Configuration public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
-
==============================
10.이 설명을 보안 구성에 추가하면 문제가 해결되었습니다.
이 설명을 보안 구성에 추가하면 문제가 해결되었습니다.
@Configuration("MySecurityConfig") public class MySecurityConfig extends WebSecurityConfigurerAdapter
from https://stackoverflow.com/questions/33523952/spring-security-configuration-order-not-unique-exception by cc-by-sa and MIT license