我正在尝试实现一个最终用户启动的logout
机制。
我有4个主要实体参与其中。
***客户端:**在Keycloak上注册为公共OIDC
客户端的Angular
应用程序
***Keycloak:**充当身份代理
***Spring授权服务器:**在Keycloak上注册的身份提供者
***资源服务器:**具有安全REST
端点的Spring Boot
应用程序
当最终用户启动logout
时,Angular
应用程序将调用Keycloak的end_session_endpoint
。我已在Keycloak中将我的身份提供者(Spring Authorization Server
)的logout
URL配置为http://localhost:9000/logout,这是默认的Spring Security
注销端点。
**仅供参考:**我尚未启用BackChannel
或FrontChannel
注销.
在Developer Console
的Network
选项卡中,调用顺序如下:
在检查Spring Authorization Server
中的DEBUG
日志时,我能够看到该特定最终用户发生了logout
,包括使JSESSIONID
无效,但会话未在Keycloak中终止,这导致用户保持登录状态并访问安全的REST
端点。Spring Authorization Server
是否需要向Keycloak返回一个特定响应,以传达logout
进程在结束时已完成,Keycloak现在可以结束会话?
这是我在Spring Authorization Server
上的logout
的逻辑。
@Bean
@Order(Ordered.LOWEST_PRECEDENCE)
public SecurityFilterChain defaultSecurityFilterChain(HttpSecurity http) throws Exception {
http.csrf(csrf -> csrf.disable())
.authorizeHttpRequests(
authorize -> authorize.mvcMatchers("/hello/**").permitAll().anyRequest().authenticated())
.formLogin(form -> form.loginPage("/login").permitAll())
.addFilterAfter(cookieFilter, ChannelProcessingFilter.class)
.logout().logoutSuccessUrl("http://localhost:4200");
return http.build();
}
我完全不知道我错过了什么,使Keycloak结束会议在它的结束。任何线索将不胜感激。
谢谢你,谢谢你
更新:post_logout_redirect_uri
参数在logout
请求中发送到Spring Authorization Server
。我无法看到重定向到此URI,这可能是Keycloak会话未终止的原因。
post_logout_redirect_uri=http://127.0.0.1:8080/auth/realms/SpringBootKeycloak/broker/oidc/endpoint/logout_response
1条答案
按热度按时间0ejtzxu11#
终于成功了!
logoutSuccessUrl("http://localhost:4200")
不正确。正如我在问题的Update部分提到的,Keycloak发送了一个
post_logout_redirect_uri
参数(在ChromeDeveloper Console
中检查了Network
调用中的logout
端点),logoutSuccessUrl
或redirectUri
应设置为http://127.0.0.1:8080/auth/realms/SpringBootKeycloak/broker/oidc/endpoint/logout_response
另外,请注意上面的URL将
state
作为请求参数。最初,它给了我一个400 Bad Request
,因为我没有发送state
。由于在
Spring Authorization Server
上启动logout
时,我需要截获state
参数,因此我添加了一个自定义注销处理程序来完成这项工作。更新的
WebSecurityConfig
: