【发布时间】:2018-03-26 12:13:47
【问题描述】:
目前我正在体验新的 Spring 响应式堆栈,并希望在 Spring Session 2.0 中使用响应式功能。
在传统的 Servlet 方法中,Spring Session 提供了一个HttpSessionStrategy 来检测 cookie 或请求标头中的会话。使用HeaderHttpSessionStrategy 为RESTful API 实现类似身份验证的令牌(默认名称为X-AUTH-TOKEN)很容易。
Spring 5 核心提供了一个 WebSessionIdResolver 来为 Reactive 环境做同样的事情。
但是当它与 Spring Security 一起使用并希望它以传统方式工作时,我无法让它工作。
SessionConfig 文件。
@EnableSpringWebSession
public class SessionConfig {
@Bean
public ReactorSessionRepository sessionRepository() {
return new MapReactorSessionRepository(new ConcurrentHashMap<>());
}
@Bean
public WebSessionIdResolver headerWebSessionIdResolver() {
HeaderWebSessionIdResolver resolver = new HeaderWebSessionIdResolver();
resolver.setHeaderName("X-SESSION-ID");
return resolver;
}
}
部分SecurityConfig。
@EnableWebFluxSecurity
class SecurityConfig {
@Bean
SecurityWebFilterChain springWebFilterChain(HttpSecurity http) throws Exception {
return http
.authorizeExchange()
.pathMatchers(HttpMethod.GET, "/posts/**").permitAll()
.pathMatchers(HttpMethod.DELETE, "/posts/**").hasRole("ADMIN")
//.pathMatchers("/users/{user}/**").access(this::currentUserMatchesPath)
.anyExchange().authenticated()
.and()
.build();
}
一个测试rest控制器文件,它返回当前的Session ID。
@RestController
public class SessionRestController {
@GetMapping("/sessionId")
public Map<String, String> sessionId(WebSession session){
Map<String, String> map = new HashMap<>();
map.put("id", session.getId());
return map ;
}
}
当我启动应用程序并使用 curl 访问 /sessionId 时,响应头中没有会话信息。
curl -v -u "user:password" http://localhost:8080/sessionId
我在查询结果中得到了会话id,放入请求头中访问受保护的资源,得到401。
curl -v -X POST -H "X-SESSION-ID:xxxx" http://localhost:8080/posts
更新:可以在here找到一个工作示例。
【问题讨论】:
标签: spring spring-security reactive-programming spring-session spring-webflux