Spring Boot-如何有条件地启用/禁用会话

时间:2018-07-27 10:37:14

标签: java spring spring-security spring-session

我已经使用Spring构建了REST API服务,并在其中使用MongoDB启用了会话:

@Configuration
@EnableMongoHttpSession(maxInactiveIntervalInSeconds = Globals.SESSION_MAX_INTERVAL)
public class SessionConfig {

    @Bean
    public AbstractMongoSessionConverter createSessionConverterBean() {
        return new JacksonMongoSessionConverter(Collections.singletonList(new GeoModule()));
    }
}

但是,我希望控制应该向哪个连接发出会话。当前,每个HTTP请求都有为其生成的会话,但是在某些情况下不需要该会话,因此我不希望使用永远不会使用的会话对象来使会话存储混乱。

一种这样的情况是充当内容管理系统的独立桌面应用程序。该应用程序不需要HTTP会话,因为身份验证是通过应用程序端通过自定义授权标头完成的。此应用程序还仅从特定的根路由映射访问端点:

公共流量路由到api.domain.com/pub,而CMS流量路由通过api.domain.com/cpi

很高兴能够告诉Spring不需要为到达/cpi的任何请求创建会话。桌面应用程序还提供了一个独特的Origin,如果更容易实现,我也可以匹配它。

我的Web安全性如下:

@Override
protected void configure(HttpSecurity http) throws Exception {
    http.authorizeRequests()
            .anyRequest()
            .permitAll()
            .and()
            .cors()
            .and()
            .httpBasic();
    http.csrf().disable(); // Self-implemented
}

我到处搜索,没有发现任何东西。谁能指出我正确的方向?

谢谢!

2 个答案:

答案 0 :(得分:0)

您可以在以下方案中添加多个安全配置。其中一个显式匹配所有 / cpi 请求,而另一个则处理其余请求。

您还可以通过这种方式配置不同的身份验证方法。

@Order(1)
@Configuration
public static class Custom1WebSecurityConfigurerAdapter extends 
WebSecurityConfigurerAdapter {
    http
                .antMatcher("/cpi/**")
                .authorizeRequests()
                ...

    http.sessionManagement() // dont create a session for this configuration
              .sessionCreationPolicy(SessionCreationPolicy.STATELESS);
}


@Order(2)
@Configuration
public static class Custom2WebSecurityConfigurerAdapter extends 
WebSecurityConfigurerAdapter {
    http
                .authorizeRequests()
                ...
}

答案 1 :(得分:0)

您可以在application.yml文件中尝试以下内容。

server:
  servlet:
    session:
      persistent: false
      timeout: 0