简单来说,当我们在容器中部署应用程序时,会创建一个会话.可以使用web.xml中的以下条目控制此会话到期
<session-config> <session-timeout>60</session-timeout> </session-config>
接下来,当我使用SAML扩展的Spring Security时,显然会应用相同的会话概念. (我正在WildFly 8.2中部署应用程序,如果这很重要)
此外,当应用程序会话到期时,注销行为似乎等同于本地注销概念.
到现在为止还挺好.现在让我们说SAML断言好2小时,用户已经积极工作了2个小时.接下来的请求会发生什么?它应该重新登录IDP吗?但是,这对用户来说不方便吗?如果应用程序重定向到IDP以在断言到期2小时后再次登录,那么应如何处理AJAX请求?
解决方法
可以通过重写SAMLAuthenticationProvider和更改方法getExpirationDate(credential)来禁用此行为,该方法返回Assertion到期时的时间,如果它从未返回,则返回null.然后,应用程序将完全依赖于容器中配置的会话到期.
ExpiringUsernameAuthenticationToken到期后,Spring Security会将当前令牌传递给AuthenticationManager(在< security:authentication-manager>下的securityContext.xml中配置).
您可以通过添加自己的能够处理ExpiringUsernameAuthenticationToken的AuthenticationProvider来影响接下来发生的事情.否则系统会因ProviderNotFoundException或其他一些AuthenticationException(如BadCredentialsException)而失败(如果您同时使用用户名/密码身份验证).
该异常随后由ExceptionTranslationFilter处理,ExceptionTranslationFilter通过调用配置的身份验证EntryPoint来启动新的身份验证过程 – 例如,SAMLEntryPoint,使用默认IDP启动身份验证或显示IDP选择页面.正如您所说,该过程也将基本上执行本地注销.
默认情况下,系统对所有HTTP调用的行为都相同 – 无论是否为AJAX.您可以通过将API和普通网址拆分为单独的< security:http>来定义不同的行为.元素并为每个使用不同的EntryPoints(接口AuthenticationEntryPoint).例如,Http403ForbiddenEntryPoint可能适合您的AJAX调用.