当前位置: 首页 > 知识库问答 >
问题:

在使用spring-security和spring-webflux时禁用WebSession创建

谢俊力
2023-03-14
   @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);
                   }
               });
           }
       };
   }

共有1个答案

诸彬郁
2023-03-14

问题#6552:Spring团队将修复Webflux Security的会话创建策略。

问题是,每个请求都要调用请求缓存,以查看是否保存了一个要重播的值,因此每个请求都要查找WebSession。由于正在使用无效的会话id查找WebSession,因此Spring WebFlux会使会话cookie无效。~rwinch

我创建gh-7157是为了限制访问请求缓存的时间(以及WebSession)。同时,如果不需要请求缓存,可以使用以下方法禁用它:

http
.requestCache()
    .requestCache(NoOpServerRequestCache.getInstance());
.and().securityContextRepository(NoOpServerSecurityContextRepository.getInstance())

(以前的解决办法)

除了重写WebSessionManager之外,您还可以禁用所有安全功能,并用您的自定义实现替换AuthenticationManagerSecurityContextrepository,去掉基于会话的功能:

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

更多信息:API的Spring webflux自定义身份验证。

 类似资料:
  • AppServlet-servlet.xml 我面对的错误是 org.springframework.beans.factory.BeanCreationException:创建名为“User BowlingDataController”的bean时出错:注入autowired依赖项失败;嵌套异常为org.springframework.beans.factory.beanCreationExce

  • 问题内容: 我有一个配置了Spring Security的Spring Boot Web应用程序。我想暂时禁用身份验证(直到需要)。 我将此添加到: 这是我的一部分 但是我仍然包括一个基本的安全性:启动时会生成一个默认的安全性密码,并且我仍会收到HTTP身份验证提示框。 我的pom.xml: 在WebSecurityConfig.java中配置了安全性(我已注释了注释以将其禁用): 问题答案: 使

  • 我有一个Spring WebFlux安全性,如下所示,并希望使用属性控制CSRF。我如何在这里单独添加CSRF检查?

  • 我想在某些单元测试期间禁用endpoint的安全性。我使用的是webflux功能endpoint,所以下面的配置不起作用。 首先感谢你的帮助

  • 我一直在尝试使用我自己的自定义身份验证方法在Web流量中启用Spring Security性。到目前为止还不错,但我无法使用permitall允许某些URL模式。 我尝试过创建不同的SecurityWebFilterChain bean,也尝试过使用不同的配置,但似乎没有任何效果。 这是我的SecurityWebFilterChain 我有一个内部运行状况检查系统,只要我的应用程序启动,它就会运行

  • 我正试图禁用Spring Security性以请求前端。我使用oauth2-auto-configuration作为一个依赖项,我还从Maven中删除了spring starter安全性。我还需要说,一切都是从邮递员工作。 CORS滤波器 谢了。