好吧,我是一个巨大的RubyCAS菜鸟,这让我发疯了。
我已经安装了rubycas-client
gem,并在this repo跟随了官方的Sinatra设置。完成此设置的方式,每次我请求页面时,我都会收到一个一次性票证,该票证作为查询附加到URL,如下所示:
http://localhost:9393/?ticket=ST-1373928850
......等等。
如果我刷新页面,我收到一条Sinatra错误,说票已经用完了!
那么我有两个问题。
:sessions
,但这会导致单点注销失败。rubycas-client
GitHub Repo中的步骤(用Sinatra的:session
助手取代ActiveRecord会话存储空间。)Sinatra的RubyCAS文档很差,所以我正在寻找一个明确的答案。
答案 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 来销毁当前会话数据。