1

現在、私は新しい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を見つけることができます。

答えて

0

デフォルトでSpring FrameworkのcookieWebSessionIdResolver(CookieWebSessionIdResolver)を使用しています。これはCookieに基づいています。 HeaderWebSessionIdResolver型の別のBeanを作成すると、Spring Sessionによって自動的に選択され、ヘッダーベースの戦略に切り替わります。

どちらの戦略でも、着信ServerExchangeヘッダーを読み取り、CookieヘッダーまたはSESSION httpヘッダーを読み込んでいるかどうかにかかわらず、セッションIDを調べるようになっています。

これらの戦略では、クライアント(Webブラウザまたはコード)がクッキーを生成するためのセットクッキーディレクティブであるか、SESSIONヘッダー(HeaderWebSessionIdResolverのヘッダー名のデフォルト名) 。

+0

私はこれをはっきりと知っており、 'WebSessionIdResolver'に関するテストコードを読んでいます。しかし、私のサンプルでSpring SessionとSpring Securityで使用した場合、期待どおりに動作しません。私はcurlを使ってAPIをテストしました。セッション情報はレスポンスヘッダに付加されていませんでした。また、次のステップで最初のリクエストから取得したセッションを確認しません。 – Hantsy

+0

マイ・コードをSpring Boot 2.0.0.M6にアップデートして動作させ、[サンプルコード](https://github.com/hantsy/spring-reactive-sample/tree/master/session-header)を確認してください。 – Hantsy

関連する問題