繁体   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