Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
RubyCAS具有持久的单票&;西纳特拉_Ruby_Sinatra_Cas - Fatal编程技术网

RubyCAS具有持久的单票&;西纳特拉

RubyCAS具有持久的单票&;西纳特拉,ruby,sinatra,cas,Ruby,Sinatra,Cas,好吧,我是一个巨大的鲁比卡斯noob,这让我发疯 我已经安装了rubycas客户端gem,并在上安装了官方的Sinatra设置。按照这种设置方式,每次请求页面时,我都会收到一张一次性票证,作为查询附加到URL,如下所示: http://localhost:9393/?ticket=ST-1373928850。。。等等 如果我刷新页面,我会收到一个Sinatra错误,说票已经用完了 那么,我有两个问题 车票是否符合重新装载的标准行为 如何保存会话的CAS登录,同时仍保留单次注销 我所做的: 我已

好吧,我是一个巨大的鲁比卡斯noob,这让我发疯

我已经安装了
rubycas客户端
gem,并在上安装了官方的Sinatra设置。按照这种设置方式,每次请求页面时,我都会收到一张一次性票证,作为查询附加到URL,如下所示:

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

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

那么,我有两个问题

  • 车票是否符合重新装载的标准行为
  • 如何保存会话的CAS登录,同时仍保留单次注销
  • 我所做的:
    • 我已经尝试在Sinatra中实现
      :sessions
      ,但这会导致单次注销失败
    • 我已经尽力按照中的步骤操作(用Sinatra的
      :session
      助手替换ActiveRecord会话存储)

    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