Spring Boot安全性:所请求的URL创建了不需要的Redis会话

时间:2019-02-25 08:46:41

标签: spring spring-boot session spring-security

可以说登录网址为“ / login”。 有两种受保护的资源:

  • “ /受保护”
  • “ /”,即302重定向到“ / protected”

当未经身份验证的用户尝试访问“ /受保护”时,他将被重定向到“ /登录”。在后台创建一个会话,在其中存储 SPRING_SECURITY_SAVED_REQUEST ,以便在成功登录后将用户重定向到“ /受保护” URL。

这是Spring安全性的默认行为。

我的问题: 即使用户调用“ /”,也会创建会话。因此,所有在没有有效登录信息的情况下都调用域的漫游器和渗透测试确实会在基础redis层中创建会话。

在没有存储重定向请求或至少将它们限制为有效后端端点的已定义列表时,如何防止创建这些会话?

我的安全配置:

protected void configure(HttpSecurity http) throws Exception {
    http
            .authorizeRequests()
            .antMatchers("/password/forgot/**").permitAll()
            .antMatchers("/password/reset/**").permitAll()
            .antMatchers("/css/**").permitAll()
            .antMatchers("/js/**").permitAll()
            .antMatchers("/img/**").permitAll()
            .antMatchers( "/favicon.ico").permitAll()
            .antMatchers("/login").permitAll()
            .anyRequest().fullyAuthenticated();

    http
            .formLogin()
            .loginPage("/login")
            .permitAll()
            .successHandler(authSuccessHandler)
            .and()
            .logout().logoutRequestMatcher(new AntPathRequestMatcher("/logout")).logoutSuccessUrl("/login")
            .deleteCookies("SESSION")
            .clearAuthentication(true)
            .invalidateHttpSession(true)
            .permitAll();

    http.sessionManagement()
            .maximumSessions(1)
            .and()
            .sessionCreationPolicy(SessionCreationPolicy.NEVER);

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

1 个答案:

答案 0 :(得分:0)

您可以通过设置NullRequestCache避免创建SPRING_SECURITY_SAVED_REQUEST,但是我想这对您的用例不起作用。

  

或至少将它们限制为有效后端端点的已定义列表?

这可以通过提供requestCache并设置RequestMatcher-

来完成。
      final HttpSessionRequestCache requestCache = new HttpSessionRequestCache();
        requestCache.setRequestMatcher(new AntPathRequestMatcher("/**"));

    http
        .authorizeRequests()
            .antMatchers("/", "/home").permitAll()
            .anyRequest().authenticated()
            .and()
            .requestCache().requestCache(requestCache)
            .and()...