RubyCAS具有持久的单票&;西纳特拉
好吧,我是一个巨大的鲁比卡斯noob,这让我发疯 我已经安装了RubyCAS具有持久的单票&;西纳特拉,ruby,sinatra,cas,Ruby,Sinatra,Cas,好吧,我是一个巨大的鲁比卡斯noob,这让我发疯 我已经安装了rubycas客户端gem,并在上安装了官方的Sinatra设置。按照这种设置方式,每次请求页面时,我都会收到一张一次性票证,作为查询附加到URL,如下所示: http://localhost:9393/?ticket=ST-1373928850。。。等等 如果我刷新页面,我会收到一个Sinatra错误,说票已经用完了 那么,我有两个问题 车票是否符合重新装载的标准行为 如何保存会话的CAS登录,同时仍保留单次注销 我所做的: 我已
rubycas客户端
gem,并在上安装了官方的Sinatra设置。按照这种设置方式,每次请求页面时,我都会收到一张一次性票证,作为查询附加到URL,如下所示:
http://localhost:9393/?ticket=ST-1373928850
。。。等等
如果我刷新页面,我会收到一个Sinatra错误,说票已经用完了
那么,我有两个问题
- 我已经尝试在Sinatra中实现
,但这会导致单次注销失败:sessions
- 我已经尽力按照中的步骤操作(用Sinatra的
助手替换ActiveRecord会话存储):session
Sinatra的RubyCAS文档相当糟糕,因此我正在寻找一个明确的答案。当您尝试用相同的票证重新加载页面时,它正在做正确的事情。那张票已经过验证。获得验证响应后,需要设置自己的应用程序cookie或其他会话选项 我通常会添加一个方法,将会话属性添加到用户的cookie中,如:
session["cas"]["username"] = <user from cas validation response>
在我的Sinatra配置块中,我执行以下操作:
use Rack::Session::Cookie, :key => "example.com",:secret => "veryrandomhex"
我希望这有帮助,有任何问题请告诉我
以下更新
在讨论这个问题时,我们发现RubyCas说在使用CAS时不要在生产中为ruby应用程序使用常规cookie会话。您要做的是:
A.确保您的cookie在CAS cookie到期的同时或更早到期
和/或
B.确保每个浏览器会话都有cookie,然后在下一个浏览器会话中重新验证CAS用户
对于机架式cookie,当cookie设置为过期时,您可以指定此额外配置:
:expire\u after=>1440,
(其中1440以分钟为单位)对于ruby CAS,有两种会话:
(1) 。应用程序会话
(2) 。单点登录(SSO)会话
您可以使用sinatra会话gem来管理应用程序会话,只需使用会话结束!用于销毁应用程序会话的助手方法。要销毁SSO会话,请在注销路由中取消设置会话[:cas_ticket]参数
例如:
如果是西纳特拉:
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来销毁当前会话数据。Dude,非常感谢。据我所知,
Rack::Session::Cookie
代码不应用于生产。你知道什么可以在生产中使用吗?我没有看到任何地方说它不能在生产中使用:或者(无论如何,我已经在生产中运行了3年以上的10-15个应用程序上使用了它)来自RubyCAS创建者的RubyCAS Sinatra示例。他们正在使用一种类似的技术,并发表评论说,不建议将其用于生产。RubyCAS实现都支持使用其他形式的会话存储。很好的发现,我假设这是基于不使cookie过期。但是,如果您比CAS cookie更快地使cookie过期,那么您可能会说该用户将在CAS之前或与CAS同时注销您的应用程序(如果该应用程序是第一个通过CAS身份验证的应用程序)。或者,无论浏览器会话打开多长时间,您都可以保留cookie,然后在新会话中,您的应用程序可以再次验证CAS会话。太棒了。那是有道理的!
get '/logout' do
session_end! # provided by sinatra-session gem
session[:cas_ticket] = nil # session variable set by CAS server
end