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

Java 使用Spring安全适配器时的KeyClope会话超时行为,java,spring,spring-security,openid-connect,keycloak,Java,Spring,Spring Security,Openid Connect,Keycloak,当在OIDC客户端协议中使用Keyclope和Spring Security时,当Keyclope SSO会话超时已经发生时,应用程序会话不会过期。因此,如果用户在访问令牌过期后访问受KeyClope适配器保护的应用程序的任何部分,则Spring安全性仍然具有身份验证对象。但是,当KeyClope适配器检查访问令牌是否处于活动状态(此时不会处于活动状态)时,适配器(RefreshAbleKeyClope SecurityContext.java类)会尝试使用其拥有的刷新令牌获取新的访问令牌。由于

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

刷新令牌失败状态:400{“错误”:“无效授权”,“错误描述”:“刷新令牌已过期”}

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

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

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

keydape文档的xml配置部分似乎缺少一些内容。有一个筛选器可用于检查令牌,并在无法刷新令牌时将用户注销,即KeyDopperSecurityContextRequestFilter

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

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

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

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


如何部署web应用程序?哪个服务器?除了在KC中配置的会话超时之外,您是否指定了其他会话超时?@XtremeBiker,谢谢您的关注。web应用程序是与KeyClope分开部署的(它在Tomcat中运行)。应用程序本身严重依赖JCR会话(它是一个由CMS支持的网站),但在我的安全配置中,我没有明确指定任何会话策略。您在Tomcat中定义了任何会话超时配置吗?@XtremeBiker,没有,Tomcat没有会话超时配置(既不在web app web.xml中,也不在container web.xml中)。在Java源代码中搜索硬编码会话超时(例如
HttpSession.setMaxInactiveInterval(int)
)也找不到任何内容。我发现了与3.4.3中描述的相同的功能。4.3.0版的行为与预期的一样。