【问题标题】:RubyCAS with a persistent single ticket & Sinatra具有持久单票和 Sinatra 的 RubyCAS
【发布时间】:2013-07-15 23:33:11
【问题描述】:

好吧,我是一个巨大的 RubyCAS 菜鸟,这让我发疯了。

我已经安装了rubycas-client gem,并在this repo 上安装了官方的 Sinatra 设置。这种设置的完成方式是,每次我请求一个页面时,我都会收到一张一次性票,它作为查询附加到 URL:

http://localhost:9393/?ticket=ST-1373928850...等

如果我刷新页面,我会收到 Sinatra 错误,提示票已用完!

那么我有两个问题。

  1. ticket-per-reload 是标准行为吗?
  2. 如何保存会话的 CAS 登录信息并仍保留单点注销?

我做了什么:

  • 我已经尝试在 Sinatra 中实现 :sessions,但这会导致单点注销失败。
  • 我已经尽力按照rubycas-client GitHub Repo 中的步骤进行操作(用 Sinatra 的 :session 助手替换 ActiveRecord 会话存储)。

Sinatra 的 RubyCAS 文档相当差,所以我正在寻找一个明确的答案。

【问题讨论】:

    标签: ruby sinatra cas


    【解决方案1】:

    当您尝试使用同一张票重新加载页面时,它正在做正确的事情。那张票已经过验证。当您收到验证响应后,您需要设置自己的应用程序 cookie 或其他会话选项。

    我通常会添加一个方法,将会话属性添加到用户的 cookie 中,例如:

    session["cas"]["username"] = <user from cas validation response>
    

    然后在未来的请求中,Sinatra 应用程序可以使用帮助方法保护您想要的任何路由,例如:

    cas = RestClient::Resource.new "#{cas_url}/login", :timeout => 5
    checked = cas.get
    
    return true if checked.code == 200
    

    在我的 Sinatra 配置块中,我这样做:

     use Rack::Session::Cookie, :key => "example.com",:secret => "veryrandomhex"
    

    希望对你有帮助,有任何问题可以告诉我。

    以下更新

    在讨论这个问题时,我们发现 RubyCas 说在使用 CAS 时不要在生产中为您的 ruby​​ 应用程序使用常规 cookie 会话。你要做的是:

    A.确保您的 cookie 与 CAS cookie 在同一时间或之前过期

    和/或

    B.确保您的 cookie 是每个浏览器会话的,然后在下一个浏览器会话中重新验证 CAS 用户。

    对于 Rack cookie,您可以为 cookie 设置为过期时间指定此额外配置::expire_after =&gt; 1440,(其中 1440 以分钟为单位)

    【讨论】:

    • 老兄,非常感谢。据我了解,Rack::Session::Cookie 代码不应该在生产中使用。你知道什么可以在生产中使用吗?
    • 我没有看到任何地方说它不能在生产中使用:sinatrarb.com/faq.html#sessionsrack.rubyforge.org/doc/classes/Rack/Session/Cookie.html(对于它的价值,我已经在 10-15 个正在运行的应用程序中使用它生产 3 年以上)
    • This is a file 来自 RubyCAS 创建者的 RubyCAS Sinatra 示例。他们正在使用类似的技术,并附有评论指出不建议将其用于生产。 RackCAS 和 RubyCAS 实现都支持使用其他形式的会话存储,particularly when using Single Sign-Out
    • 很好的发现,我假设这是基于不使 cookie 过期。但是,如果您的 cookie 比 CAS cookie 更快地过期,那么您可能会说用户将在 CAS 之前或同时从您的应用程序中注销(如果这是第一个通过 CAS 身份验证的应用程序)。或者,您可以将 cookie 保留多久浏览器会话保持打开状态,然后在新会话中,您的应用可以再次验证 CAS 会话。
    • 太棒了。这是有道理的!
    【解决方案2】:

    对于 ruby​​ CAS,有两种会话:

    (1)。应用程序会话。

    (2)。单点登录 (SSO) 会话。

    您可以使用 sinatra-session gem 来管理应用程序会话,只需使用 session_end!帮助方法来销毁应用程序会话。要销毁 SSO 会话,请取消设置注销路由中的 session[:cas_ticket] 参数。

    示例:

    如果是 Sinatra:

    get '/logout' do 
            session_end!                      # provided by sinatra-session gem
            session[:cas_ticket] = nil        # session variable set by CAS server
          end
    

    这里我们明确地将 session[:cas_ticket] 设置为 nil,但是您可以在注销路由中使用 session.clear 来销毁当前会话数据。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多