拥有持久性单票的RubyCAS&西纳特拉

时间:2013-07-15 23:33:12

标签: ruby sinatra cas

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

我已经安装了rubycas-client gem,并在this repo跟随了官方的Sinatra设置。完成此设置的方式,每次我请求页面时,我都会收到一个一次性票证,该票证作为查询附加到URL,如下所示:

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

如果我刷新页面,我收到一条Sinatra错误,说票已经用完了!

那么我有两个问题。

  1. 是每次重新加载票证的标准行为吗?
  2. 如何保存会话的CAS登录信息并仍保留单点登录?
  3. 我做了什么:

    • 我已经离开并尝试在Sinatra中实施:sessions,但这会导致单点注销失败。
    • 我已经尽力遵循rubycas-client GitHub Repo中的步骤(用Sinatra的:session助手取代ActiveRecord会话存储空间。)

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

2 个答案:

答案 0 :(得分: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时不会在生产中使用常规cookie会话用于ruby应用程序。你想要做的是:

一个。确保您的cookie在CAS cookie

的同时或更早到期

和/或

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

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

答案 1 :(得分:0)

对于ruby CAS,有两种会话:

(1)。申请会议。

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

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

示例:

如果是Sinatra:

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

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