現在、私は新しいSpringリアクティブスタックを経験しており、Springセッション2.0でリアクティブ機能を使用したいと考えています。Spring WebSluxアプリケーションでSpring WebSessionIdResolverをSpring Security 5で使用する方法は?
伝統的なサーブレット手法では、Springセッションでは、Cookieまたは要求ヘッダーでセッションを検出するためにHttpSessionStrategy
が提供されます。 HeaderHttpSessionStrategy
を使用して、RESTful APIの認証(デフォルトでは彼の名前はX-AUTH-TOKEN
)のようなトークンを実装するのは簡単です。
スプリング5コアは、リアクティブ環境で同じことを行うWebSessionIdResolver
を提供します。
しかし、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("https://stackoverflow.com/users/{user}/**").access(this::currentUserMatchesPath)
.anyExchange().authenticated()
.and()
.build();
}
テストレストコントローラファイルでは、現在のセッション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を見つけることができます。
私はこれをはっきりと知っており、 'WebSessionIdResolver'に関するテストコードを読んでいます。しかし、私のサンプルでSpring SessionとSpring Securityで使用した場合、期待どおりに動作しません。私はcurlを使ってAPIをテストしました。セッション情報はレスポンスヘッダに付加されていませんでした。また、次のステップで最初のリクエストから取得したセッションを確認しません。 – Hantsy
マイ・コードをSpring Boot 2.0.0.M6にアップデートして動作させ、[サンプルコード](https://github.com/hantsy/spring-reactive-sample/tree/master/session-header)を確認してください。 – Hantsy