如何防止Rails创建会话?

时间:2015-10-24 12:14:57

标签: session ruby-on-rails-4 activerecord devise

我有一个Rails应用程序,我使用activerecord-session_store将会话存储在数据库中。我想阻止为未登录的用户创建会话,因为现在每个访问该站点首页的爬虫都会获得一个在数据库中保留的会话。

我的应用使用Rails 4.2.0,activerecord-session_store 0.1.1和Devise 3.5.2。

2 个答案:

答案 0 :(得分:2)

会话创建由Rack处理,commit_session method in Rack::Session::Abstract::ID提供删除会话的选项。我在我的ApplicationController中编写了一个过滤方法,如果未定义Devise的current_user,则删除会话:

after_filter :skip_session

def skip_session
  unless current_user
    request.session_options = {drop: true}
  end
end

这可以防止会话创建 1 ,但仍允许登录用户的会话。这甚至允许用户登录(非常重要) - 他们在没有会话的情况下访问登录页面,但在此过滤器运行之前提交表单Devise sets current_user,从而创建会话。

1:实际上,会话已创建且未提交;在我的情况下提交到数据库,但如果你使用Rails的默认cookie会话,这将阻止发送会话cookie。

答案 1 :(得分:2)

在Rails 5.2.0中使用:

request.session_options[:skip] = true

提交登录或注册表单时可能会导致ActionController::InvalidAuthenticityToken错误。验证protect_from_forgery中的真实性令牌似乎依赖于会话。 Quickfix:在控制器中禁用(例如SessionsController):

skip_before_action :verify_authenticity_token, only: [:create]

为了退出工作:

skip_after_action :skip_session, only: [:destroy]