복붙노트

[SPRING] 스프링 보안 다중 URL 룰 세트가 함께 작동하지 않음

SPRING

스프링 보안 다중 URL 룰 세트가 함께 작동하지 않음

나는 각각의 애스펙트를 주석 처리 할 때 작동하는 것처럼 보이는 HTTP 스프링 보안 설정을 가지고 있지만, 스프링 보안 규칙을 결합 할 때 작동하지 않는다. 그래서 문제는 regexMatcher 나 antMatcher와는 다르지만 규칙을 가지고있다. 조합하여 적용됩니다.

다음은 Spring Security 클래스입니다.

package com.driver.website.config;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
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.builders.WebSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.web.csrf.CsrfTokenRepository;
import org.springframework.security.web.csrf.HttpSessionCsrfTokenRepository;
import org.springframework.security.web.header.writers.StaticHeadersWriter;
import org.springframework.security.web.header.writers.frameoptions.XFrameOptionsHeaderWriter;
import org.springframework.security.web.util.matcher.RequestMatcher;

import javax.servlet.http.HttpServletRequest;
import java.security.AccessControlContext;

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Value("${widget.headers.xframeoptions.domains.allowed}")
    private String allowedXFrameOptions;

    @Value("${widget.headers.origins.allowed}")
    private String allowedOrigins;

    @Override
    public void configure(HttpSecurity http) throws Exception {
        // @formatter:off

        http.exceptionHandling().accessDeniedPage("/login")
                .and()
                .formLogin().loginPage("/login").defaultSuccessUrl("/myaccount", true).permitAll()
                .and()
                .authorizeRequests()
                .antMatchers("/**").permitAll();

        http.regexMatcher("^((?!(/widget|/assistedSearch)).)*$")
                .headers().frameOptions().disable()
                .regexMatcher("^((?!(/widget|/assistedSearch)).)*$")
                .headers()
                .xssProtection()
                .contentTypeOptions()
                .addHeaderWriter(new StaticHeadersWriter("X-FRAME-OPTIONS", "SAMEORIGIN"));

        http.antMatcher("/widget")
            .headers()
            .frameOptions()
            .disable()
            .antMatcher("/widget")
            .headers()
            .addHeaderWriter(new StaticHeadersWriter("X-FRAME-OPTIONS", "ALLOW-FROM " + allowedXFrameOptions));

        http.requestMatchers().antMatchers("/assistedSearch", "/widget")
            .and()
            .headers()
            .addHeaderWriter(new StaticHeadersWriter("Access-Control-Allow-Origin", allowedOrigins))
            .addHeaderWriter(new StaticHeadersWriter("Access-Control-Allow-Methods", "GET, POST"))
            .addHeaderWriter(new StaticHeadersWriter("Access-Control-Allow-Headers", "Content-Type"));

        // @formatter:on
    }
}

규칙은 ...

위에서 언급했듯이 For all urls ruleset을 언급 한 다음 다른 두 작업은 조화롭게 작동하지만 For all urls 규칙의 주석이없는 헤더는 표시되지 않습니다.

누구나 이것이 어떤 이유인지 알 수 있습니까? Spring Security에서 여러 룰셋을 어떻게 추가하고 기존 룰셋을 새로운 것으로 오버라이드합니까?

나는 노력했다.

http.antMatcher("/widget")
    .headers()
    .frameOptions()
    .disable()

다시 작동하는 것으로 보이지만 조합은 아닙니다.

미리 감사드립니다!

해결법

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

    1.이전 matchers를 무시합니다. HttpSecurity.html # antMatcher :

    이전 matchers를 무시합니다. HttpSecurity.html # antMatcher :

    및 HttpSecurity.html # regexMatcher :

    하나 이상의 HttpSecurity 설정이 필요하다면, Spring Security Reference :

  2. from https://stackoverflow.com/questions/39457121/spring-security-multiple-url-ruleset-not-working-together by cc-by-sa and MIT license