如何防止 Rails 创建会话?

Dre*_*ens 3 session activerecord devise ruby-on-rails-4

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

我的应用程序使用 Rails 4.2.0、activerecord-session_store 0.1.1 和 Devise 3.5.2。

Han*_*sen 5

在 Rails 5.2.0 中使用:

request.session_options[:skip] = true
Run Code Online (Sandbox Code Playgroud)

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

skip_before_action :verify_authenticity_token, only: [:create]
Run Code Online (Sandbox Code Playgroud)

为了注销工作:

skip_after_action :skip_session, only: [:destroy]
Run Code Online (Sandbox Code Playgroud)


Dre*_*ens 4

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

\n\n
after_filter :skip_session\n\ndef skip_session\n  unless current_user\n    request.session_options = {drop: true}\n  end\nend\n
Run Code Online (Sandbox Code Playgroud)\n\n

这会阻止会话创建1,但仍允许登录用户进行会话。这甚至允许用户登录(非常重要)\xe2\x80\x94他们在没有会话的情况下访问登录页面,但在提交表单设计集后current_user此过滤器运行之前提交表单设计集,从而创建会话。

\n\n

1:实际上,会话已创建,只是未提交;在我的例子中,提交是到数据库,但是如果您使用 Rails 的默认 cookie 会话,这将阻止发送会话 cookie。

\n