带有弹簧靴的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 中不起作用