4

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

我已经安装了gem,并在这个 reporubycas-client中遵循了官方的 Sinatra 设置。这种设置的完成方式,每次我请求一个页面时,我都会收到一张一次性票,它作为查询附加到 URL,如下所示:

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

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

那我有两个问题。

  1. 每次重新加载票是标准行为吗?
  2. 如何保存会话的 CAS 登录名并仍保留单点注销?

我做了什么:

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

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

4

2 回答 2

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 => 1440,其中 1440 以分钟为单位)

于 2013-11-24T21:11:56.083 回答
0

在 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来销毁当前会话数据。

于 2014-12-02T12:48:35.230 回答