Подтвердить что ты не робот

Создание нескольких разделов HTTP в Spring Конфигурация безопасности Java

Используя Spring конфигурацию безопасности XML, вы можете определить несколько элементов HTTP для указания разных правил доступа для разных частей вашего приложения. Пример, приведенный в 8.6 Advanced Namespace Configuration, определяет отдельные разделы состояния и состояния без учета состояния приложения, причем первая использует сеансы и регистрацию формы, а вторая - без сеансов и аутентификации 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>

Я не могу понять, как сделать то же самое с Java Config. Очень важно отключить сеансы и использовать другую точку входа для моих веб-сервисов. Сейчас у меня есть следующее:

@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));
                });
}

Используя это, я смог отключить защиту CSRF для своих веб-сервисов. Но мне действительно нужна целая отдельная конфигурация HTTP, чтобы я мог отключить сеансы и указать другую точку входа. Я знаю, что я могу использовать requestMatcher или requestMatchers, чтобы ограничить URI, к которым он применяется, но не кажется, что вы можете использовать его для создания отдельных конфигураций. Это почти так, как будто мне нужны два метода configure(HttpSecurity security).

4b9b3361

Ответ 1

В Spring Безопасность для имитации поведения нескольких элементов <http> из XML в конфигурации Java создает несколько классов для конфигурации безопасности. В общем случае лучше всего создать общую конфигурацию безопасности с несколькими внутренними классами для определения безопасности для HttpSecurity. См. здесь для образца.

И здесь соответствующий раздел в официальной документации безопасности Spring:
5.7 Несколько HttpSecurity