[英]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個模塊:
mvn
。 服務器將位於http:// localhost:19999 / uaa mvn
將在http:// localhost:8080上啟動該應用程序 我的sso注銷邏輯如下所示:
但是,在我參加春季課程之后,步驟5並沒有發生。 瀏覽器將直接轉到web-app / dashboard。
確保在運行sos-spring-session分支之前啟動本地redis守護程序。
我創建了2個分支來顯示不同的行為:
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.