Gateway integrated security oauth2 logout failed

20 views Asked by At

When I integrate security oauth2 and keycloak in the gateway everything seems to work fine, but when I logout I find that I can't logout I also configured logoutSuccessHandler but it seems that this configuration doesn't work. From the logs, I also see that it destroys the authentication information in the container, but not in the keyclaok. debug found that it doesn't go into the logoutSucessHandler method either. Below is my configuration and code,please help,thanks

@Configuration
@EnableWebFluxSecurity
public class SecurityConfig {

    @Autowired
    private ReactiveClientRegistrationRepository clientRegistrationRepository;

    @Bean
    public SecurityWebFilterChain securityWebFilterChain(ServerHttpSecurity http) {
        return http.authorizeExchange(exchanges -> exchanges
                        .pathMatchers("/actuator/**", "/").permitAll()
                        .anyExchange().authenticated()
                )
                // 覆盖默认登录页面,配置 exceptionHandling().authenticationEntryPoint()
                // 和(可选) oauth2Login().authorizationRequestResolver()
                .oauth2Login(oauth2 -> oauth2
                        .authorizationRequestResolver(this.authorizationRequestResolver())
                )
                .exceptionHandling(exceptionHandling -> exceptionHandling
                        .authenticationEntryPoint(new RedirectServerAuthenticationEntryPoint("/login/oauth2/authorization/keycloak"))
                )
                .logout(logout -> logout
                        // 无法更换注销的请求方式
                        .logoutSuccessHandler(keycloakLogoutSuccessHandler())
                )
                .csrf().disable()
                .build();
    }

    private ServerOAuth2AuthorizationRequestResolver authorizationRequestResolver() {
        ServerWebExchangeMatcher authorizationRequestMatcher =
                new PathPatternParserServerWebExchangeMatcher(
                        "/login/oauth2/authorization/{registrationId}");

        return new DefaultServerOAuth2AuthorizationRequestResolver(
                clientRegistrationRepository, authorizationRequestMatcher);
    }


    public ServerLogoutSuccessHandler keycloakLogoutSuccessHandler() {
        System.out.println(11111);
        OidcClientInitiatedServerLogoutSuccessHandler oidcLogoutSuccessHandler =
                new OidcClientInitiatedServerLogoutSuccessHandler(this.clientRegistrationRepository);
        oidcLogoutSuccessHandler.setPostLogoutRedirectUri("{baseUrl}/login/oauth2/authorization/keycloak");

        return oidcLogoutSuccessHandler;
    }
spring:
  application:
    name: gatewayservice

  security:
    oauth2:
      client:
        provider:
          keycloak:
            user-name-attribute: preferred_username
            issuer-uri: ${keycloak.hostname}/auth/realms/${keycloak.realm}
#            token-uri: ${keycloak.hostname}/auth/realms/${keycloak.realm}/protocol/openid-connect/token
#            authorization-uri: ${keycloak.hostname}/auth/realms/${keycloak.realm}/protocol/openid-connect/auth
#            user-info-uri: ${keycloak.hostname}/auth/realms/${keycloak.realm}/protocol/openid-connect/userinfo
#            jwk-set-uri: ${keycloak.hostname}/auth/realms/${keycloak.realm}/protocol/openid-connect/certs
        registration:
          keycloak:
            provider: keycloak
            scope: openid
            clientName: Keycloak
            client-id: ${keycloak.client-id}
            client-secret: ${keycloak.client-secret}
            client-authentication-method: post
            authorization-grant-type: authorization_code
            redirect-uri: "{baseUrl}/login/oauth2/code/keycloak"
0

There are 0 answers