使用 Spring 安全适配器时的 Keycloak 会话超时行为



当将Keycloak和Spring Security与OIDC客户端协议一起使用时,当Keycloak SSO会话超时已经发生时,应用程序会话不会过期。因此,如果用户在访问令牌过期后访问受 Keycloak 适配器保护的应用程序的任何部分,Spring 安全性仍然具有身份验证对象。但是,当 Keycloak 适配器检查访问令牌是否处于活动状态(此时它不会处于活动状态(时,因此适配器(RefreshableKeycloakSecurityContext.java 类(尝试使用它拥有的刷新令牌获取新的访问令牌。由于刷新令牌已在 Keycloak 中失效,因此适配器会抛出

Refresh token failure status: 400 {"error":"invalid_grant","error_description":"Refresh token expired"}

因此,用户仍然可以导航和访问应用程序的任何部分,而无需进入登录页面重新进行身份验证。

任何提示/想法如何实现所需的行为,以便在Keycloak SSO会话过期时,用户将被重定向到登录页面,并且Spring身份验证将失效?

Spring-Security: 4.0.4.RELEASE
Keycloak Spring Security Adapter: 3.4.2.Final
Keycloak Server: 3.4.3.Final

Keycloak 文档的 xml 配置部分似乎缺少一些东西。有一个过滤器用于检查令牌并在无法刷新时注销用户,KeycloakSecurityContextRequestFilter。

因此,如果您使用的是基于文档的 XML 配置,则必须添加以下 bean:

<bean id="keycloakSecurityContextRequestFilter"
class="org.keycloak.adapters.springsecurity.filter.KeycloakSecurityContextRequestFilter" />

然后将其添加到 security:http 配置中:

<security:custom-filter ref="keycloakSecurityContextRequestFilter" after="FORM_LOGIN_FILTER" />

最新更新