基本上我无法使用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显示了差异。
我将非常感谢您就如何解决此问题提出任何建议和意见。
答案 0 :(得分:1)
我在spring-boot 1.3.0.RC1,spring-session和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
相关postscript:for spring-boot 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;
}
答案 1 :(得分:1)
该代码存在很多问题,但停止使用Spring Session的问题是两个应用程序共享一个cookie。上下文路径是" /"对于"主要" webapp,因此当auth服务器在同一主机上运行时,它会尝试使用相同的cookie。使用本地会话时并不重要,但是当您使用分布式会话时,当2个应用程序尝试共享同一会话时,您会陷入困境。您可以使用网络应用中的server.context-path
(例如/app
)并对HTML等进行相应更改来确定浏览器是否遵循路径返回到那里。