0

我有一个 CAS-Server 和一个通过 Spring-Security 配置的客户端。到目前为止,单点登录和单点注销工作正常。

我仍然面临会话超时问题。据我了解,票证到期政策不受安全 CAS 客户端会话空闲的影响。因此,客户端必须主动重新验证票证以查看票证是否已过期并且没有被 CAS 服务器发布过期事件,就像执行单次注销时的情况一样。

为了强制我的 Spring 安全客户端定期检查票证的到期情况,我可能会将会话超时设置为较低的值,例如一分钟左右。但这有一个缺点,就是我的所有会话数据都被删除了。不是很用户友好。

有没有办法告诉 spring-security 定期检查票证是否仍然有效而不首先破坏用户会话?

4

4 回答 4

2

我认为没有这样的方法。Spring Security 和 Spring Security Cas 被实现为一组 Servlet API 过滤器/监听器。所以 Spring Security Cas 只在一些 Http 请求/Session 事件处理期间起作用。我不认为 spring-security-cas.jar 对某些调度库有任何依赖。

于 2012-12-13T13:19:43.993 回答
2

我对 Javascript 解决方案非常有信心,因为它只是强制本地注销的简单检查。但是,它需要自定义您的 CAS 服务器,而您无法做到。

您可以在应用程序端使用较短的会话来强制进行定期重新身份验证的解决方案,但这意味着您将经常使应用程序会话无效并重新创建它。

更好的解决方案可以基于gatewayCAS 协议的参数:如果您未通过 SSO 身份验证,使用此参数将不会产生服务票证。所以你可以有:

  1. 一个应用程序过滤器,每 5 分钟保存一次当前 url,触发一个 CAS 往返, gateway=true 和一个特定的服务:http://myserver/myapp/checkCasSession
  2. 一个特定的 url : /checkCasSession :如果它收到一个服务票,一切正常,CAS 会话仍然有效,它只是恢复原始 url。如果没有服务票证,本地会话必须结束并触发本地注销。
于 2012-12-16T19:01:08.880 回答
1

您可以使用 Spring Security 开箱即用地解决这不是一个简单的问题。您需要在双方工作:客户端和服务器。我会 :

  1. 在 CAS 服务器端创建一个控制器,该控制器返回一个 JSON,指示 CASTGC 是否已过期
  2. 每 5 分钟(例如)和每次显示应用程序页面时,添加一些 javascript 来调用这个特定的 CAS 控制器,如果 CAS 会话已经结束,则也结束应用程序会话。

您需要从前端通道调用 CAS 服务器,因为 CAS 会话由 CASTGC cookie 持有。

于 2012-12-14T17:12:45.620 回答
0

您有两个会话:一个具有空闲超时的应用程序和一个具有空闲/硬超时的 CAS。通过 CAS 登录访问应用程序后,应用程序会话独立存在,并且可以比 CAS 会话持续时间更长。这通常不是问题。您要处理什么用例?

于 2012-12-14T08:42:26.717 回答