[JAVA] Définissez les en-têtes HTTP (X-Frame-Options) uniquement pour des URL spécifiques dans Spring Security

Contexte

J'ai créé une page d'intégration avec Spring-boot. Celui à afficher à partir d'autres sites avec iframe. À ce moment, Spring Security a été introduit et l'en-tête HTTP "X-Frame-Options" est devenu DENY par défaut, et la page intégrée n'a pas été affichée.

Cette X-Frame-Options elle-même devrait être DENY afin de supprimer le clic jacking sur les pages ordinaires, j'ai donc décidé qu'il était préférable de ne pas envoyer cet en-tête uniquement sur la page d'intégration. Cependant, "définir les options X-Frame uniquement pour une URL spécifique" était un peu compliqué, alors je l'ai résumé.

Je pense que d'autres en-têtes HTTP peuvent être définis pour chaque URL si nécessaire (non vérifiés).

Objectif

Cible URL X-Frame-Options
example.com/contents/embed/** N'envoyez pas l'en-tête lui-même
Autre que l'URL ci-dessus DENY (par défaut)

référence

Les personnes ayant les mêmes problèmes sont en débordement de pile. Donc, cette fois, j'en ai parlé.

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

Réglage

Si vous le définissez avec le même "configure (HttpSecurity http)", toutes les URL seront affectées. Il semble que la clé soit de préparer plusieurs extensions de WebSecurityConfigurerAdapter.

@EnableWebSecurity
public class WebMVCSecurity {
    //Définissez les paramètres d'authentification. option. Ceci est juste un échantillon, X-Frame-Cela n'affecte pas les options, vous pouvez donc le modifier.
    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication()
                .withUser("user").password("password").roles("USER").and()
                .withUser("admin").password("password").roles("USER", "ADMIN");
    }

    //C'est le plus important.
    //Créez une instance de WebSecurityConfigurerAdapter.@Définissez l'ordre de lecture avec l'annotation Order.
    @Configuration
    @Order(1)
    public static class ApiWebSecurityConfigurationAdapter extends WebSecurityConfigurerAdapter {
        protected void configure(HttpSecurity http) throws Exception {
            // 「"/contents/embed/**"Spécifiez l'URL que vous souhaitez appliquer.
            //Cette fois, je ne voulais définir aucun en-tête, alors ".headers().frameOptions().disable()".
            // 「.headers().frameOptions().sameOrigin()Il existe également des paramètres tels que ", veuillez donc le vérifier.
            http.antMatcher("/contents/embed/**").headers().frameOptions().disable();
        }
    }

    //Créez une autre instance de WebSecurityConfigurerAdapter.
    // 「"/contents/embed/**"Les paramètres ici sont appliqués aux URL qui ne correspondent pas à.
    // @Si vous n'ajoutez pas l'annotation Order, d'autres@Il est dit qu'il sera chargé après la commande.
    @Configuration
    public static class FormLoginWebSecurityConfigurerAdapter extends WebSecurityConfigurerAdapter {
        @Override
        protected void configure(HttpSecurity http) throws Exception {
            http.authorizeRequests()
                    .anyRequest().authenticated()
                    .and()
                    .formLogin();

            //etc. Veuillez définir en fonction du projet.
        }
    }
} 

c'est tout.

Recommended Posts

Définissez les en-têtes HTTP (X-Frame-Options) uniquement pour des URL spécifiques dans Spring Security
Créer une authentification par clé API pour l'API Web dans Spring Security