带有弹簧靴的keycloak openid单次注销

Posted

技术标签:

【中文标题】带有弹簧靴的keycloak openid单次注销【英文标题】:keycloak openid single log out with spring boot 【发布时间】:2018-11-05 08:21:26 【问题描述】:

我正在尝试使用 keycloak 和 openid 在我的 Spring Boot 应用程序中实现单次注销。

我已经使用 sprint boot 1.5.3 和 spring 安全适配器(文档 here)设置了 keycloak 3.4.3,算法使用了 tomcat 适配器(文档 here)。在我尝试退出所有会话之前,一切正常。

我试过了:

1) 在 keycloak 管理控制台 ui 上:注销所有会话 结果:它确实清除了 keycloak 中的所有会话,但没有清除我的客户端应用程序中的浏览器会话。所以我一直登录,直到我手动删除它们。

2) 使用HttpServletRequest.logout()http://auth-server/auth/realms/realm-name/protocol/openid-connect/logout?redirect_uri=encodedRedirectUri(文档here),仅从当前客户端注销,而不是作为SLO 注销

我不确定 OpenID 是否支持 SLO,也找不到任何可靠的文档。

¿有没有办法使用 OpenID 和 Spring boot 实现单点注销?

【问题讨论】:

OpenId Connect 的指定方式是,如果实施得当,客户端会定期检查身份提供者以刷新访问令牌。如果您的访问令牌的寿命相对较短,则在链接会话中注销会导致它们不会被刷新。 你能详细说明一个正确的实现吗?,至少对于注销过程。 keycloak 文档在本主题中并不那么明确 我没有任何可用于测试的 KC 实例,但是如果在您的应用程序中调用 /sso/logout 端点会触发单点注销,您可以尝试一下吗?适配器应该照顾它。前任。 http://myapplication/sso/logout 我使用myapplication/sso/logout 设置了管理员 URL,它成功了,谢谢! @dgr018,您是如何实现“注销”的?当我尝试http://myapplication/sso/logout 时,它不起作用。回复我404 【参考方案1】:

您可以执行以下操作退出

   @GetMapping(path = "/logout")
   public String logout(HttpServletRequest request) throws ServletException 
      request.logout();
      return "/";
   

http

<a href="/logout">Logout</a>

【讨论】:

这会使 Spring 会话无效并且不执行任何其他操作。但是,由于 SSO 会话并未终止,您将在导航到另一个页面后立即自动重新登录。 这会使 spring 和 keycloak 会话无效,因为将我重定向到 keycloak 登录。(spring-boot 2.3.3,keycloak-spring-boot-starter 11.0.1)。 我可以确认@Ciri 的评论。 keycloak 会话没有注销。只有 Spring 无效。

以上是关于带有弹簧靴的keycloak openid单次注销的主要内容,如果未能解决你的问题,请参考以下文章

带有弹簧靴的百里香叶缓存

单次注销在 keycloak 和 spring security 中不起作用

OpenID Connect - 如何处理单次注销

如何通过带有弹簧靴的邮递员操作数据

在某些机器上构建时,带有弹簧靴的 Swagger 可以工作,但在其他机器上则不行

Keycloak 及其不同的适配器是不是实现了 Openid Connect Backchannel 注销规范