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

mwi*_*rek 3 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()));
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

公共交通路线api.domain.com/pub和 CMS 交通路线通过api.domain.com/cpi

如果能够告诉 Spring 它不需要为任何请求创建会话,那就太好了/cpi。桌面应用程序还提供了一个独特的Origin,如果更容易完成,我也可以匹配。

我的网络安全看起来像这样:

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

我已经找遍了,没有找到任何东西。任何人都可以指出我正确的方向吗?

谢谢!

S. *_*mir 6

您可以在以下方案中添加多个安全配置。其中一个明确匹配所有/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()
                ...
}
Run Code Online (Sandbox Code Playgroud)