如何使用Spring OAuth2在启用了Spring mvc应用程序的SSO上单点退出?

时间:2019-07-07 06:28:29

标签: spring spring-mvc spring-security single-sign-on spring-oauth2

我正在使用Spring OAuth2与SSO架构师一起开发Spring Web应用程序

  • 2个Spring MVC Web应用程序
  • 1个授权服务器负责SSO和颁发/检查令牌
  • 1个资源服务器,服务于/ api / me

单点登录时一切正常,但是我不知道如何单点登录(1个应用程序注销,其他应用程序也注销)。当前,似乎每个具有最低配置的应用(例如下面的代码段)都使用不同的会话存储,并且在成功进行身份验证后,它将经过身份验证的会话保存在其自己的会话存储中,并且该会话中的所有后续请求都会在Cookie中被拦截。因此,当sso-server注销时,它不能使其他应用程序会话存储上的相关会话无效。有人可以建议我一些单点退出策略吗?

Web客户端application.yml文件:

security:
  oauth2:
    client:
      clientId: metlife_monitor
      clientSecret: password
      accessTokenUri: http://localhost:8668/sso-server/oauth/token
      userAuthorizationUri: http://localhost:8668/sso-server/oauth/authorize
      tokenName: oauth_token
    resource:
      userInfoUri: http://localhost:8688/api/me

Web应用程序类:

@SpringBootApplication
@EnableOAuth2Sso
@EnableJdbcHttpSession
public class Application  extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .antMatcher("/**")
                .authorizeRequests()
                .antMatchers("/", "/login**", "/error**", "/webjars/**").permitAll()
                .anyRequest().authenticated()
                .and().logout()
                .logoutUrl("/logout")
                .logoutSuccessUrl("http://localhost:8668/sso-server/logout")
                .invalidateHttpSession(true)
                .deleteCookies("client-session", "JSESSIONID")
                .permitAll()
                .and().csrf().disable()
        ;

    }
    public static void main(String[] args) {
        SpringApplication.run(App1Application.class, args);
    }

}

1 个答案:

答案 0 :(得分:0)

单点登录(SSO)服务器和中央身份验证服务器(CAS)之间存在差异。如果您的身份验证服务器不管理任何会话,它将不再是SSO服务器,而成为CAS。

在您的情况下,您可以让SSO服务器管理会话,并且还可以分发会话ID,以便资源服务器在为请求提供服务之前对其进行验证。它确实导致了一个健谈系统。如果您可以在会话期满后留一点延迟,那么可以制作非常短暂的令牌,这些令牌会附加到SSO上,而不必在每次请求时都验证令牌,您只需刷新令牌即可,有效的会话。

如果可以,请考虑使用Keycloak。它也具有适用于Java和Javascript应用程序的适配器