1

基本的に、spring-boot oauth2 統合を spring-session で動作させることはできません。

spring-boot の問題トラッカーで問題を作成しました: https://github.com/spring-projects/spring-boot/issues/4360

この問題を実証するためにレポを作成しました

https://github.com/sloppycoder/spring-session-oauth-problem

2 つのモジュールがあります。

  • auth-server は oauth2 認証サーバーです。それを実行するには、ただmvn. サーバーはhttp://localhost:19999/uaaになります
  • web-app は、シングル サインオンに auth-server を使用する Web アプリケーションです。http://localhost:8080mvnでアプリを起動します

私の sso ログアウト ロジックは次のように機能します。

  1. 「ログアウト」ボタンをクリックすると、ログアウトが成功した後、リダイレクト先の URL http://localhost:8080/ssologoutを渡し、 http://localhost:19999/uaa/logoutに POST が実行されます。
  2. 認証サーバーからログアウトし、http://localhost:8080/ssologoutにリダイレクトします
  3. http://localhost:8080/ssologout次に、 http://localhost:8080/logoutに POST します。
  4. (デフォルトの spring-security 動作) ログアウト後、http://localhost:8080/login?logoutにリダイレクトします
  5. http://localhost:8080/login?logout http://localhost:19999/uaa/loginにリダイレクトし、ユーザーに再度ログインするように求めます。

しかし、春のセッションに入った後、ステップ 5 は行われません。ブラウザは web-app /dashboard に直接アクセスします。

sos-spring-session ブランチを実行する前に、必ずローカルの redis デーモンを開始してください。

異なる動作を示すために 2 つのブランチを作成しました。

  1. sso のみ。spring-boot は auth-server と統合され、問題なく動作します。
  2. sso-spring-session。ログアウトは機能しません。

github compareは違いを示しています。

これを解決する方法についてのアドバイスや提案をいただければ幸いです。

4

2 に答える 2

1

spring-boot 1.3.0.RC1、spring-session、および redis で同様の問題が発生しました。

spring-boot 1.3.0.RC1 : Redis に永続化されたセッションから oauth2 ユーザー情報を取得する際の ClassCastException

フィルターの順序を次のように変更すると機能する場合があります

'requestContextFilter' < 'OAuth2ClientContextFilter' < 'springSessionRepositoryFilter'

@Bean
@ConditionalOnMissingBean(RequestContextFilter.class)
public RequestContextFilter requestContextFilter() {

  return new RequestContextFilter();
}

@Bean
public FilterRegistrationBean requestContextFilterChainRegistration(
  @Qualifier("requestContextFilter") Filter securityFilter) {

  FilterRegistrationBean registration = new FilterRegistrationBean(securityFilter);
  registration.setName("requestContextFilter");

  // note : must previous order of oAuth2ClientContextFilter
  registration.setOrder(SessionRepositoryFilter.DEFAULT_ORDER + 1);

  return registration;
}

@Bean
public FilterRegistrationBean sessionRepositoryFilterRegistration(
  SessionRepositoryFilter sessionRepositoryFilter) {

  FilterRegistrationBean registration = new FilterRegistrationBean(sessionRepositoryFilter);
  registration.setName("springSessionRepositoryFilter");

  // note : must following order of oAuth2ClientContextFilter
  registration.setOrder(Integer.MAX_VALUE - 1);

  return registration;
}

また、依存関係を削除する必要がある場合がありますorg.springframework.boot:spring-boot-devtools

https://github.com/spring-projects/spring-boot/issues/3805に関連


追記:スプリングブート用 1.3.3.RELEASE

spring-session、redis、spring-security-oauth2 はフィルター順以下で動作します。

# logs on bootRun task
Mapping filter: 'characterEncodingFilter' to: [/*]
Mapping filter: 'springSessionRepositoryFilter' to: [/*]
Mapping filter: 'requestContextFilter' to: [/*]
Mapping filter: 'OAuth2ClientContextFilter' to: [/*]
Mapping filter: 'springSecurityFilterChain' to: [/*]
Mapping servlet: 'dispatcherServlet' to [/]

現在必要な設定は以下です。

@Bean
@ConditionalOnMissingBean(RequestContextFilter.class)
public RequestContextFilter requestContextFilter() {
  return new RequestContextFilter();
}

@Bean
public FilterRegistrationBean requestContextFilterChainRegistration(
  @Qualifier("requestContextFilter") Filter securityFilter) {

  FilterRegistrationBean registration = 
    new FilterRegistrationBean(securityFilter);

  registration.setName("requestContextFilter");

  // note : must to be following order of springSessionRepositoryFilter
  registration.setOrder(SessionRepositoryFilter.DEFAULT_ORDER + 1);

  return registration;
}
于 2015-11-02T06:55:49.127 に答える