web-dev-qa-db-fra.com

Création de plusieurs sections HTTP dans Spring Security Java Config

À l'aide de la configuration XML de Spring Security, vous pouvez définir plusieurs éléments HTTP pour spécifier différentes règles d'accès pour différentes parties de votre application. L'exemple donné dans 8.6 Advanced Namespace Configuration définit des sections séparées avec état et sans état de l'application, la première utilisant des sessions et la connexion au formulaire, et la seconde n'utilisant aucune session et l'authentification BASIC:

<!-- Stateless RESTful service using Basic authentication -->
<http pattern="/restful/**" create-session="stateless">
    <intercept-url pattern='/**' access='ROLE_REMOTE' />
    <http-basic />
</http>

<!-- Empty filter chain for the login page -->
<http pattern="/login.htm*" security="none"/>

<!-- Additional filter chain for normal users, matching all other requests -->
<http>
    <intercept-url pattern='/**' access='ROLE_USER' />
    <form-login login-page='/login.htm' default-target-url="/home.htm"/>
    <logout />
</http>

Je n'arrive pas à comprendre comment faire la même chose avec Java Config. Il est important de désactiver les sessions et d'utiliser un point d'entrée différent pour mes services Web. Pour l'instant, je dispose des éléments suivants:

@Override
public void configure(WebSecurity security)
{
    security.ignoring().antMatchers("/resource/**", "/favicon.ico");
}

@Override
protected void configure(HttpSecurity security) throws Exception
{
    security
            .authorizeRequests()
                .anyRequest().authenticated()
            .and().formLogin()
                .loginPage("/login").failureUrl("/login?loginFailed")
                .defaultSuccessUrl("/ticket/list")
                .usernameParameter("username")
                .passwordParameter("password")
                .permitAll()
            .and().logout()
                .logoutUrl("/logout").logoutSuccessUrl("/login?loggedOut")
                .invalidateHttpSession(true).deleteCookies("JSESSIONID")
                .permitAll()
            .and().sessionManagement()
                .sessionFixation().changeSessionId()
                .maximumSessions(1).maxSessionsPreventsLogin(true)
                .sessionRegistry(this.sessionRegistryImpl())
            .and().and().csrf()
                .requireCsrfProtectionMatcher((r) -> {
                    String m = r.getMethod();
                    return !r.getServletPath().startsWith("/services/") &&
                            ("POST".equals(m) || "PUT".equals(m) ||
                                    "DELETE".equals(m) || "PATCH".equals(m));
                });
}

Grâce à cela, j'ai pu désactiver la protection CSRF pour mes services Web. Mais j'ai vraiment besoin d'une configuration HTTP distincte pour pouvoir désactiver les sessions et spécifier un point d'entrée différent. Je sais que je peux utiliser requestMatcher ou requestMatchers pour restreindre les URI auxquels il s'applique, mais il ne semble pas que vous puissiez l'utiliser pour créer des configurations distinctes. C'est presque comme si j'avais besoin de deux méthodes configure(HttpSecurity security).

26
Nick Williams

Dans Spring Security, pour imiter le comportement de plusieurs <http> éléments de XML dans Java crée plusieurs classes pour la configuration de la sécurité. En général, il est préférable/simple de créer une configuration de sécurité commune avec plusieurs classes internes pour la définition de la sécurité pour HttpSecurity. Voir ici pour un exemple.

Et voici la section correspondante dans la documentation officielle de Spring Security:
5.7 Multiple HttpSecurity

28
M. Deinum