[JAVA] Legen Sie HTTP-Header (X-Frame-Optionen) nur für bestimmte URLs in Spring Security fest

Hintergrund

Ich habe eine Einbettungsseite mit Spring-Boot erstellt. Diejenige, die von anderen Sites mit iframe angezeigt wird. Zu diesem Zeitpunkt wurde Spring Security eingeführt und der HTTP-Header "X-Frame-Options" wurde standardmäßig VERWEIGERT, und die eingebettete Seite wurde nicht angezeigt.

Diese X-Frame-Optionen selbst sollten VERWEIGERT sein, um das Klick-Jacking auf normalen Seiten zu unterdrücken. Daher habe ich beschlossen, dass es besser ist, diesen Header nicht nur auf der Einbettungsseite zu senden. Das "Festlegen von X-Frame-Optionen nur für eine bestimmte URL" war jedoch etwas kompliziert, daher habe ich es zusammengefasst.

Ich denke, dass bei Bedarf andere HTTP-Header für jede URL festgelegt werden können (nicht überprüft).

Zweck

Ziel-URL X-Frame-Options
example.com/contents/embed/** Senden Sie den Header nicht selbst
Andere als die obige URL VERWEIGERN (Standard)

Referenz

Personen mit denselben Problemen befinden sich im Stapelüberlauf. Also habe ich mich diesmal darauf bezogen.

Disable X-FrameOptions response header for a URL Spring Security JAVA config https://stackoverflow.com/questions/42257402/disable-x-frameoptions-response-header-for-a-url-spring-security-java-config

Aufbau

Wenn Sie dieselbe Einstellung "configure (HttpSecurity http)" festlegen, sind alle URLs betroffen. Es scheint, dass der Schlüssel darin besteht, mehrere erweiterte WebSecurityConfigurerAdapters vorzubereiten.

@EnableWebSecurity
public class WebMVCSecurity {
    //Nehmen Sie Einstellungen für die Authentifizierung vor. Möglichkeit. Dies ist nur ein Beispiel, X.-Frame-Es hat keine Auswirkungen auf Optionen, sodass Sie es ändern können.
    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication()
                .withUser("user").password("password").roles("USER").and()
                .withUser("admin").password("password").roles("USER", "ADMIN");
    }

    //Das ist das Wichtigste.
    //Erstellen Sie eine Instanz von WebSecurityConfigurerAdapter.@Stellen Sie die Lesereihenfolge mit der Auftragsanmerkung ein.
    @Configuration
    @Order(1)
    public static class ApiWebSecurityConfigurationAdapter extends WebSecurityConfigurerAdapter {
        protected void configure(HttpSecurity http) throws Exception {
            // 「"/contents/embed/**"Geben Sie die URL an, die Sie anwenden möchten.
            //Dieses Mal wollte ich keinen Header setzen, also ".headers().frameOptions().disable()".
            // 「.headers().frameOptions().sameOrigin()Es gibt auch Einstellungen wie ", also probieren Sie es bitte aus.
            http.antMatcher("/contents/embed/**").headers().frameOptions().disable();
        }
    }

    //Erstellen Sie eine weitere Instanz von WebSecurityConfigurerAdapter.
    // 「"/contents/embed/**"Die Einstellungen hier werden auf URLs angewendet, die nicht entsprechen.
    // @Wenn Sie die Bestellanmerkung nicht hinzufügen, andere@Es wird gesagt, dass es nach der Bestellung geladen wird.
    @Configuration
    public static class FormLoginWebSecurityConfigurerAdapter extends WebSecurityConfigurerAdapter {
        @Override
        protected void configure(HttpSecurity http) throws Exception {
            http.authorizeRequests()
                    .anyRequest().authenticated()
                    .and()
                    .formLogin();

            //etc. Bitte je nach Projekt einstellen.
        }
    }
} 

das ist alles.

Recommended Posts

Legen Sie HTTP-Header (X-Frame-Optionen) nur für bestimmte URLs in Spring Security fest
Erstellen Sie eine API-Schlüsselauthentifizierung für die Web-API in Spring Security