Отключить создание WebSession при использовании spring-security с spring-webflux - PullRequest
0 голосов
/ 09 мая 2019

Я запускаю приложение весенней загрузки без сохранения состояния с API-интерфейсом отдыха и хочу отключить создание WebSessions, как описано https://www.baeldung.com/spring-security-session

Я создал свой собственный WebSessionManager, который не сохраняет сеанс.

   @Bean
   public WebSessionManager webSessionManager() {
       return new WebSessionManager() {
           @Override
           @NonNull
           public Mono<WebSession> getSession(@NonNull final ServerWebExchange exchange) {
               return Mono.just(new WebSession() {

                   @Override
                   @NonNull
                   public String getId() {
                       return "";
                   }

                   @Override
                   @NonNull
                   public Map<String, Object> getAttributes() {
                       return new HashMap<>();
                   }

                   @Override
                   public void start() {
                   }

                   @Override
                   public boolean isStarted() {
                       return true;
                   }

                   @Override
                   @NonNull
                   public Mono<Void> changeSessionId() {
                       return Mono.empty();
                   }

                   @Override
                   @NonNull
                   public Mono<Void> invalidate() {
                       return Mono.empty();
                   }

                   @Override
                   @NonNull
                   public Mono<Void> save() {
                       return Mono.empty();
                   }

                   @Override
                   public boolean isExpired() {
                       return false;
                   }

                   @Override
                   @NonNull
                   public Instant getCreationTime() {
                       return Instant.now();
                   }

                   @Override
                   @NonNull
                   public Instant getLastAccessTime() {
                       return Instant.now();
                   }

                   @Override
                   public void setMaxIdleTime(@NonNull final Duration maxIdleTime) {
                   }

                   @Override
                   @NonNull
                   public Duration getMaxIdleTime() {
                       return Duration.ofMinutes(1);
                   }
               });
           }
       };
   }

Это работает, но мне интересно, есть ли лучший способ не создавать сеанс.

Ответы [ 2 ]

1 голос
/ 11 мая 2019

К сожалению, Spring WebFlux пока не предоставляет основанное на Spring MVC решение для отключения создания сеанса с помощью STATELESS policy Проблема # 6552: Политика создания сеанса с Webflux Security , и, похоже, больше нет работы над этим. в настоящее время.


В дополнение к переопределению WebSessionManager вы можете отключить все функции безопасности и заменить authenticationManager & securityContextRepository вашими собственными реализациями, исключающими функции на основе сеанса:

@Configuration
public class SecurityConfiguration {
    @Bean
    public SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) {
        // Disable default security.
        http.httpBasic().disable();
        http.formLogin().disable();
        http.csrf().disable();
        http.logout().disable();

        // Add custom security.
        http.authenticationManager(this.authenticationManager);
        http.securityContextRepository(this.securityContextRepository);

        // Disable authentication for `/auth/**` routes.
        http.authorizeExchange().pathMatchers("/auth/**").permitAll();
        http.authorizeExchange().anyExchange().authenticated();

        return http.build();
    }
}

Дополнительная информация: Пользовательская аутентификация Spring webflux для API .

0 голосов
/ 09 мая 2019

Вы пробовали:

@Configuration
@EnableWebSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

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

        http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
}

?

...