首页 文章

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

提问于
浏览
1

基本上我无法使用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注销逻辑的工作方式如下:

然而,在我参加 Spring 季 Session 后,第5步没有发生 . 浏览器直接进入web-app / dashboard .

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

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

  • 仅限sso . spring-boot与auth-server集成,工作正常 .

  • sso-spring-sesson . 注销不起作用 .

github compare显示了差异 .

我将很感激有关如何解决这个问题的任何建议和建议 .

2 回答

  • 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

    该代码存在很多问题,但阻止它与Spring Session一起工作的问题是两个应用程序正在共享一个cookie . 对于"main" webapp,上下文路径为"/",因此当auth服务器在同一主机上运行时,尝试使用相同的cookie . 使用本地会话时无关紧要,但是当您使用分布式会话时,当2个应用程序尝试共享同一会话时,您会搞乱状态 . 您可以通过在webapp中使用 server.context-path (例如 /app )并对HTML等进行相应更改来修复它,以确保浏览器遵循路径返回到那里 .

相关问题