Spring Session: Как создать отдельные политики управления сеансом для разных URL-адресов - PullRequest
0 голосов
/ 05 августа 2020

В проекте весенней загрузки с использованием весеннего сеанса, как мы можем настроить две политики управления сеансом для разных URL-адресов?

  1. Для Angular внешнего интерфейса я хотел бы использовать реализацию по умолчанию и создать X-Auth-Token токен (при необходимости создает сеанс)
  2. Но для открытых конечных точек API я хотел бы использовать управление сеансом без сохранения состояния

Я пробовал следующую конфигурацию, но сеанс вообще не создается . Я думаю, что второй блок перезаписывает sessionCreationPolicy, поскольку он находится в конце

SecurityConfig. java

@Override
    public void configure(HttpSecurity http) throws Exception
    {


//Requests from angular app
http.authorizeRequests()
        .antMatchers("/", "/login","/api/v1/user/login", "/api/v1/user/authenticate", "/api/v1/user/logout", "/api/v1/health/find/status").permitAll()
        .antMatchers("/api/v1/person/**").hasAnyAuthority(ROLE_USER)
        .and()
        .httpBasic()
        .and()
    .exceptionHandling().authenticationEntryPoint(customBasicAuthenticationEntryPoint)
        .and()
        .logout()
        .invalidateHttpSession(true).clearAuthentication(true)
        .and().sessionManagement()
                .sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED);

//Requests from external systems
http.authorizeRequests()
        .antMatchers("/api/v1/external/**").hasAnyAuthority(ROLE_API_USER)
        .and().sessionManagement()
                .sessionCreationPolicy(SessionCreationPolicy.STATELESS);

}

Обновление

Добавлены настраиваемые адаптеры конфигуратора WebSecurity для конечных точек API и приложения Angular, как показано ниже. После добавления этого API конечная точка не создает сеанс, но Angular HTTP-запрос также не создает сеанс

@Configuration
@EnableWebSecurity
public class SecurityConfig
{
 ....

    @Configuration
    @Order(1)
    public class ExternalApiSecurityConfig extends WebSecurityConfigurerAdapter
    {
        @Autowired
        public void configureGlobal(AuthenticationManagerBuilder auth)
        {
            auth.authenticationProvider(activeDirectoryLdapAuthenticationProvider()).eraseCredentials(true);
        }

        @Override
        public void configure(HttpSecurity http) throws Exception
        {
            http.authorizeRequests()
                    .antMatchers("/api/v1/search/**").hasAnyAuthority(ROLE_API_USER, ROLE_SYS_ADMIN)
                    .and()
                    .httpBasic()
                    .and()
                    .exceptionHandling().authenticationEntryPoint(customBasicAuthenticationEntryPoint)
                    .and().sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);

            http.headers()
                    .frameOptions().disable();

            // Uses CorsConfigurationSource bean defined below
            http.cors().configurationSource(corsConfigurationSource());

            http.csrf().disable();
        }
    }

    @Configuration
    @Order(2)
    public class DefaultSecurityConfig extends WebSecurityConfigurerAdapter
    {
        @Bean(BeanIds.AUTHENTICATION_MANAGER)
        @Override
        public AuthenticationManager authenticationManagerBean() throws Exception
        {
            return super.authenticationManagerBean();
        }

        @Override
        public void configure(WebSecurity webSecurity)
        {
            webSecurity.ignoring().antMatchers("/static/**");
        }

        @Override
        public void configure(HttpSecurity http) throws Exception
        {
    http.authorizeRequests()
        .antMatchers("/", "/login","/api/v1/user/login", "/api/v1/user/authenticate", "/api/v1/user/logout", "/api/v1/health/find/status").permitAll()
        .antMatchers("/api/v1/person/**").hasAnyAuthority(ROLE_USER)
        .and()
        .httpBasic()
        .and()
    .exceptionHandling().authenticationEntryPoint(customBasicAuthenticationEntryPoint)
        .and()
        .logout()
        .invalidateHttpSession(true).clearAuthentication(true)
        .and().sessionManagement()
                .sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED);
        }

        @Autowired
        public void configureGlobal(AuthenticationManagerBuilder auth)
        {
            auth.authenticationProvider(activeDirectoryLdapAuthenticationProvider()).eraseCredentials(true);
            auth.authenticationProvider(getDaoAuthenticationProvider()).eraseCredentials(true);
        }

    }
 ....
}

1 Ответ

1 голос
/ 05 августа 2020

Вам необходимо создать две разные цепочки фильтров, когда вы создаете WebSecurityConfigurerAdapter, вы создаете цепочку прокси-фильтров, которая содержит требуемые HTTP-фильтры безопасности.

Вы должны увидеть это при запуске если вы ищете DefaultSecurityFilterChain в журналах, вы снова должны увидеть оператор ведения журнала в строках Creating filter chain: any request, [Filters...]

DefaultSecurityFilterChain по умолчанию - любой запрос (/**) будет go через Это. Чтобы иметь возможность разделять запросы на разные цепочки фильтров, вам необходимо создать второй WebSecurityConfigurerAdapter, охватить его любыми путями и применить конфигурацию, которую вы хотите, к каждому из них.

Одна проблема заключается в том, что вам также необходимо применить чем выше приоритет адаптера, то конечный код будет выглядеть примерно так any request для перехвата любого другого запроса.

...