【问题标题】:CAS and Spring-Security: regularly check if a ticket has expiredCAS 和 Spring-Security:定期检查票证是否已过期
【发布时间】:2012-12-13 09:39:48
【问题描述】:

我有一个 CAS-Server 和一个通过 Spring-Security 配置的客户端。到目前为止,单点登录和单点注销都运行良好。

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

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

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

【问题讨论】:

    标签: spring-security single-sign-on cas


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 我害怕那个。看来我必须在这里添加我自己的过滤器。
      【解决方案3】:

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

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

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

      【讨论】:

      • 严格来说我无权访问 CAS 服务器端。难道不能制作一个每 5 分钟调用一次票证验证 URL 的 spring-security 过滤器吗?
      • javascript 方法似乎有点不安全。我不想让最终用户有任何可能篡改 CAS 会话。
      【解决方案4】:

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

      【讨论】:

      • 我希望 CAS 服务器成为确定会话过期超时的唯一权威。我只对硬(绝对最大)超时感兴趣,而不是空闲帧。
      猜你喜欢
      • 2020-03-11
      • 2017-05-31
      • 1970-01-01
      • 1970-01-01
      • 2018-02-11
      • 2019-07-23
      • 2021-12-21
      • 1970-01-01
      • 2021-05-14
      相关资源
      最近更新 更多