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"