簡體   English   中英

spring-boot 1.3-M5 oauth2 SSO不能與spring-session一起使用嗎?

[英]spring-boot 1.3-M5 oauth2 SSO does not work with spring-session?

基本上,我無法使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個模塊:

我的sso注銷邏輯如下所示:

  1. 單擊“注銷”按鈕將對成功http:// localhost:19999 / uaa / logout進行POST ,並在成功注銷后傳遞URL重定向到http:// localhost:8080 / ssologout
  2. 驗證服務器注銷並重定向到http:// localhost:8080 / ssologout
  3. http:// localhost:8080 / ssologout,然后開機自檢到http:// localhost:8080 / logout
  4. (默認的spring-security行為)注銷后,重定向到http:// localhost:8080 / login?logout
  5. http:// localhost:8080 / login?注銷重定向到http:// localhost:19999 / uaa / login並提示用戶再次登錄。

但是,在我參加春季課程之后,步驟5並沒有發生。 瀏覽器將直接轉到web-app / dashboard。

確保在運行sos-spring-session分支之前啟動本地redis守護程序。

我創建了2個分支來顯示不同的行為:

  1. SSO-只。 spring-boot與auth-server集成在一起,一切正常。
  2. SSO-彈簧雪村。 注銷不起作用。

github compare顯示了區別。

我將不勝感激有關如何解決此問題的任何建議。

我在spring-boot 1.3.0.RC1,spring-session和redis上遇到了類似的問題。

spring-boot 1.3.0.RC1:從會話獲取oauth2用戶信息的ClassCastException持久存在於Redis中

如果您將過濾器順序更改為

'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;
}

該代碼有很多問題,但是使它停止與Spring Session一起工作的一個問題是這兩個應用程序共享一個cookie。 對於“主” Web應用程序,上下文路徑為“ /”,因此,當身份驗證服務器在同一主機上運行時,它會嘗試使用相同的cookie。 使用本地會話並不重要,但是當您使用分布式會話時,當兩個應用程序嘗試共享同一會話時,您會弄亂狀態。 您可以通過在webapp(例如/app )中使用server.context-path並對其HTML進行相應更改來修復它,以確保瀏覽器遵循返回到該位置的路徑。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM