복붙노트

[SPRING] / api-url에는 스프링 부트 보안에 빈 필터 목록이 있습니다.

SPRING

/ api-url에는 스프링 부트 보안에 빈 필터 목록이 있습니다.

REST 서비스가있는 Spring Boot 앱은 특정 서비스에 대한 공개 액세스를 허용해야하며 다른 서비스는 인증 된 사용자로만 제한해야합니다. 아래 그림과 같이 SecurityConfig 클래스에 configure (WebSecurity web) 메소드가 추가되면 사용자의 웹 브라우저에 403 오류가 보내지고 스프링 부트 로그 파일에 다음과 같은 오류가 표시됩니다.

/registration-form has an empty filter list  

익명 / 인증되지 않은 사용자를 포함하여 / 등록 양식 서비스를 모든 사용자에게 성공적으로 제공 받으려면 아래 코드에 어떤 변경이 가해 져야합니까?

다음은 SecurityConfig 클래스입니다.

@Configuration
@Order(SecurityProperties.ACCESS_OVERRIDE_ORDER)
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
protected static class SecurityConfiguration extends WebSecurityConfigurerAdapter {

    @Override
    public void configure(WebSecurity webSecurity) throws Exception {
        webSecurity.ignoring().antMatchers("/registration-form");
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .formLogin()
                .and()
            .httpBasic().and()
            .authorizeRequests()
                .antMatchers("/login1").permitAll()
                .antMatchers("/login2").permitAll()
                .anyRequest().authenticated();
    }
}

다음은 전체 로그입니다.

2016-04-07 16:42:18.548  INFO 8937 --- [nio-8001-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring FrameworkServlet 'dispatcherServlet'
2016-04-07 16:42:18.548  INFO 8937 --- [nio-8001-exec-1] o.s.web.servlet.DispatcherServlet        : FrameworkServlet 'dispatcherServlet': initialization started
2016-04-07 16:42:18.656  INFO 8937 --- [nio-8001-exec-1] o.s.web.servlet.DispatcherServlet        : FrameworkServlet 'dispatcherServlet': initialization completed in 108 ms
2016-04-07 16:42:18.702 DEBUG 8937 --- [nio-8001-exec-1] o.s.s.w.u.matcher.AntPathRequestMatcher  : Checking match of request : '/registration-form'; against '/css/**'
2016-04-07 16:42:18.702 DEBUG 8937 --- [nio-8001-exec-1] o.s.s.w.u.matcher.AntPathRequestMatcher  : Checking match of request : '/registration-form'; against '/js/**'
2016-04-07 16:42:18.702 DEBUG 8937 --- [nio-8001-exec-1] o.s.s.w.u.matcher.AntPathRequestMatcher  : Checking match of request : '/registration-form'; against '/images/**'
2016-04-07 16:42:18.702 DEBUG 8937 --- [nio-8001-exec-1] o.s.s.w.u.matcher.AntPathRequestMatcher  : Checking match of request : '/registration-form'; against '/**/favicon.ico'
2016-04-07 16:42:18.702 DEBUG 8937 --- [nio-8001-exec-1] o.s.s.w.u.matcher.AntPathRequestMatcher  : Checking match of request : '/registration-form'; against '/error'
2016-04-07 16:42:18.702 DEBUG 8937 --- [nio-8001-exec-1] o.s.s.w.u.matcher.AntPathRequestMatcher  : Checking match of request : '/registration-form'; against '/registration-form'
2016-04-07 16:42:18.702 DEBUG 8937 --- [nio-8001-exec-1] o.s.security.web.FilterChainProxy        : /registration-form has an empty filter list

pom.xml에서 보안에 대한 유일한 언급은 다음과 같습니다.

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-security</artifactId>
    </dependency>

pom.xml에서 버전 넘버를 둘러 보았고 가장 가까운 것이 발견되었다.

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.3.0.RELEASE</version>
    <relativePath /> <!-- lookup parent from repository -->
</parent>

계속되는 연구 :

1.)이 다른 게시물은 WebSecurity와 HttpSecurity의 차이에 대한 좋은 설명을 제공하므로 위에 표시된 코드에 WebSecurity와 HttpSecurity가 모두 포함 된 이유를 설명합니다.

2.) 2012 년 포스트는 비슷한 오류와 해법을 설명하고 있지만 XML 구성을 사용하는 Spring Security의 이전 버전에 중점을두고 있으며 Spring Configuration with Java Configuration과 관련이 없습니다.

3.)이 블로그 항목은 web.xml과 같은 오래된 xml 설정 파일이 Spring Boot의 새로운 application.properties 파일로 대체되었다고 설명합니다. 그러므로, 현재의 문제에 대한 해결책이 application.properties를 추가 할 것인지 아니면 스프링 보안을위한 Java Config를 추가 할 것인지는 확실하지 않습니다.

4.)이 블로그 항목은 @Bean 주석을 사용하여 Spring 부트 컨트롤러 클래스의 @RequestMapping 주석으로 설명 된 끝점에 필터를 추가하는 ServletContextInitializer 빈을 주입하는 방법을 설명합니다. 이 예제는 여러 부분으로 구성된 파일 필터이지만이 방법을 사용하여 현재 OP 오류 메시지를 해결하기위한 적절한 필터를 추가 할 수 있는지 궁금합니다.

5.) 이번 2014 년 포스팅에서는 Spring Boot에서 ServletContextInitializer의 동작을 커스터마이징하는 두 가지 접근법을 설명한다. 한 가지 방법은 Application.java 클래스가 SpringBootServletInitializer를 확장 한 다음 configure () 및 onStartup () 메서드를 재정의하는 것입니다. 다른 방법은 서버 네임 스페이스를 사용하여 application.properties 파일에 행을 추가하는 것입니다. 이 링크에는 application.properties에서 설정할 수있는 공통 속성 목록이 있지만 현재 OP에서 정의한 문제를 해결하기 위해 설정할 속성을 결정할 수 없습니다.

이 관련 질문에 대한 @DaveSyer의 대답은 application.properties에서 endpoints.info.sensitive = true를 설정하여 모든 끝점을 열도록 제안합니다. Endpoints에 대한 Spring의 문서 페이지를 찾았습니다. application.properties에 endpoints.name.sensitive = false를 설정하는 것이 좋습니다. 여기서 name은 끝점의 이름입니다. 그러나 application.properties에서 endpoints.api-url.sensitive = false를 설정해도 문제점이 해결되지 않으며 eclipse는 endpoints.api-url.sensitive = false가 알 수없는 특성임을 경고합니다. 다른 곳에서 속성 매핑을 정의해야하거나, /를 추가하여 endpoints./api-url.sensitive=false로 지정해야합니까? / api-url 끝점에 사용할 올바른 이름을 얻는 방법은 무엇입니까?이 문제를 해결하는 올바른 방법입니까?

7.) 나는이 다른 글을 읽고 스프링 부트 애플리케이션의 메인 애플리케이션 클래스 내에 필터 등록 빈을 만드는 예제를 사용했다. 그러나 디버그 로그는 / api-url에 빈 필터가 있음을 나타내는 동일한 메시지를 계속 표시한다. 명부. 다음은 Application 클래스에 추가 한 코드입니다.

@Bean
public FilterRegistrationBean shallowEtagHeaderFilter() {
    FilterRegistrationBean registration = new FilterRegistrationBean();
    registration.setFilter(new ShallowEtagHeaderFilter());
    registration.setDispatcherTypes(EnumSet.allOf(DispatcherType.class));
    registration.addUrlPatterns("/api-url");
    return registration;
}

이 연구에서 가능한 접근법은 다음과 같습니다.

1.) adding something to `application.properties`   
2.) adding `@Bean` annotation to inject a `ServletContextInitializer`   
3.) adding some Spring Security config using Java Configuration.   
4.) having Application.java extend SpringBootServletInitializer and   
        then overriding methods.  
5.) adding @Bean annotation to add a filter registration bean

해결법

  1. ==============================

    1.이것은 내가 어디에 일부 URL을 제한하고 일부는 공개하는 것입니다.

    이것은 내가 어디에 일부 URL을 제한하고 일부는 공개하는 것입니다.

     @Override
            public void configure(HttpSecurity http) throws Exception {
                http.csrf().disable()
                    .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
                    .and()
                    .authorizeRequests() 
                    .antMatchers(actuatorEndpoints()).hasRole(userConfig.getAdminRole())
                    .antMatchers(HttpMethod.OPTIONS, "/**").permitAll()
                    .antMatchers("/signup",
                                 "/payment/confirm",
                                 "/api/address/zipcodes/**",
                                 "/user/password/reset",
                                 "/user/password/change",
                                 "/user/email/verify",
                                 "/password/update",
                                 "/email/verify",
                                 "/new-products/**").permitAll()
                    .antMatchers("/api/**", "/files/**").authenticated();
            }
    
  2. ==============================

    2.나는 당신이 한 일이 / error view가 보호 된 리소스라고 생각한다. 열거 나 @EnableWebSecurity 사용을 중지하십시오 (봄 부팅이 당신을 위해 다르게했을 일부 항목을 끕니다).

    나는 당신이 한 일이 / error view가 보호 된 리소스라고 생각한다. 열거 나 @EnableWebSecurity 사용을 중지하십시오 (봄 부팅이 당신을 위해 다르게했을 일부 항목을 끕니다).

  3. from https://stackoverflow.com/questions/36489253/api-url-has-an-empty-filter-list-in-spring-boot-security by cc-by-sa and MIT license