我已经使用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
}
我到处搜索,没有发现任何东西。谁能指出我正确的方向?
谢谢!
答案 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