使用Spring Security Adapter时的Keycloak Session Timeout行为

时间:2018-05-18 09:24:33

标签: java spring spring-security openid-connect keycloak

当使用Keycloak和Spring Security与OIDC客户端协议时,当Keycloak SSO会话超时已经发生时,应用程序会话将不会过期。因此,如果用户在访问令牌过期后访问受Keycloak适配器保护的应用程序的任何部分,则Spring Security仍具有身份验证对象。但是,当Keycloak适配器检查Access令牌是否处于活动状态时,它不会在此时,因此适配器(RefreshableKeycloakSecurityContext.java类)尝试使用刷新令牌获取新的Access令牌。由于刷新令牌在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

1 个答案:

答案 0 :(得分:0)

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" />