복붙노트

[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. ==============================

    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. ==============================

    2.오류를 발견했습니다 ... 아무도 스 니펫에 가져 오기를 게시하지 않습니다. 우리는 다중 모듈 프로젝트 설정을 사용하고 있으며 IntelliJ는 Spring 주석을 인식하지 못하고 사용했습니다.

    오류를 발견했습니다 ... 아무도 스 니펫에 가져 오기를 게시하지 않습니다. 우리는 다중 모듈 프로젝트 설정을 사용하고 있으며 IntelliJ는 Spring 주석을 인식하지 못하고 사용했습니다.

    대신에

    Spring은 올바른 주석을 구문 분석하지 않았기 때문에 두 구성에 대해 기본값 100을 가정했습니다.

  3. ==============================

    3.보통,이 예외는 동일한 빈이 두 번 해결 될 때 발생합니다. 예를 들어 @Configuration 파일이 동일한 빈을 해석하는 applicationContext.xml을 가져 오면 응용 프로그램이 시작할 때 (해당 경우 MultiHttpSecurityConfig) 두 번 등록하려고하면이 오류가 발생합니다.

    보통,이 예외는 동일한 빈이 두 번 해결 될 때 발생합니다. 예를 들어 @Configuration 파일이 동일한 빈을 해석하는 applicationContext.xml을 가져 오면 응용 프로그램이 시작할 때 (해당 경우 MultiHttpSecurityConfig) 두 번 등록하려고하면이 오류가 발생합니다.

    XML에서 빈 정의를 제거하는 중 오류를 해결했습니다.

  4. ==============================

    4.아마 다른 클래스에 @EnableWebSecurity 주석을 달았을 수도 있습니다. 이 주석을 구현할 수있는 클래스는 단 하나 뿐이라는 점에 유의하십시오. 희망이 도움이 될 것입니다!

    아마 다른 클래스에 @EnableWebSecurity 주석을 달았을 수도 있습니다. 이 주석을 구현할 수있는 클래스는 단 하나 뿐이라는 점에 유의하십시오. 희망이 도움이 될 것입니다!

  5. ==============================

    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. ==============================

    6.최근에 같은 문제가 발생했지만 올바른 방향으로 나를 가리켜 줄 답변을 찾을 수 없었습니다. 결국 변경된 사항은 @RefreshScope 주석을 내 클래스에 추가하는 것 뿐이었다.

    최근에 같은 문제가 발생했지만 올바른 방향으로 나를 가리켜 줄 답변을 찾을 수 없었습니다. 결국 변경된 사항은 @RefreshScope 주석을 내 클래스에 추가하는 것 뿐이었다.

    @RefreshScope 주석을 제거함으로써 응용 프로그램이 작동했습니다.

  7. ==============================

    7.두 번째 WebSecurityConfigurerAdapter에 @Order (1000)를 두어 나를 위해 일했습니다.

    두 번째 WebSecurityConfigurerAdapter에 @Order (1000)를 두어 나를 위해 일했습니다.

  8. ==============================

    8.스프링 구성의 어딘가에 @order (100) 주석을 사용하는 구성이있을 수 있습니다. @order (100) 주석을 제거하거나 다른 순서 값을 지정하십시오.

    스프링 구성의 어딘가에 @order (100) 주석을 사용하는 구성이있을 수 있습니다. @order (100) 주석을 제거하거나 다른 순서 값을 지정하십시오.

  9. ==============================

    9.나는 같은 문제가 있었고 @Configuration 어노테이션을 클래스 레벨로 옮기는이 오류를 해결했다.

    나는 같은 문제가 있었고 @Configuration 어노테이션을 클래스 레벨로 옮기는이 오류를 해결했다.

    @Configuration
    public class SecurityConfiguration extends WebSecurityConfigurerAdapter { 
    
  10. ==============================

    10.이 설명을 보안 구성에 추가하면 문제가 해결되었습니다.

    이 설명을 보안 구성에 추가하면 문제가 해결되었습니다.

    @Configuration("MySecurityConfig")
    public class MySecurityConfig extends WebSecurityConfigurerAdapter
    
  11. from https://stackoverflow.com/questions/33523952/spring-security-configuration-order-not-unique-exception by cc-by-sa and MIT license