spring-boot 1.3-M5 oauth2 SSO不适用于春季会话?

时间:2015-11-01 02:41:16

标签: java spring-mvc spring-boot spring-security-oauth2 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. auth-server注销并重定向到http://localhost:8080/ssologout
  3. http://localhost:8080/ssologout然后POST到http://localhost:8080/logout
  4. 注销后
  5. (默认弹簧安全行为),重定向到http://localhost:8080/login?logout
  6. http://localhost:8080/login?logout重定向到http://localhost:19999/uaa/login并提示用户重新登录。
  7. 然而,在我参加春季会议后,第5步没有发生。浏览器直接进入web-app / dashboard。

    确保在运行sos-spring-session分支之前启动本地redis守护程序。

    我创建了2个分支以显示不同的行为:

    1. SSO-只。 spring-boot与auth-server集成,工作正常。
    2. SSO - 弹簧 - 雪村。注销不起作用。
    3. github compare显示了差异。

      我将非常感谢您就如何解决此问题提出任何建议和意见。

2 个答案:

答案 0 :(得分:1)

我在spring-boot 1.3.0.RC1,spring-session和redis上遇到了类似的问题。

spring-boot 1.3.0.RC1 : ClassCastException in getting oauth2 user info from session persisted in 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等进行相应更改来确定浏览器是否遵循路径返回到那里。