我正在开展一个用户登录和退出的项目,我知道这完全令人震惊,我们确保人们可以在完成后退出。我们注意到的一件事是,由于各种原因,当系统已将其注销时,用户可以尝试单击注销按钮。 (会话超时,从其他浏览器登录或其他原因。该站点仅允许每个用户进行一次并发登录。)
因此,当用户尝试POST到注销URL时会发生什么,因为他们没有有效的会话,因此他们无法通过CSRF验证。出于安全考虑,我们无法删除CSRF验证。
因此,我正在尝试添加一个允许我测试此行为的测试,以便不会炸毁无效的CSRF令牌,它会默默地接受用户已经注销并继续其业务
我所尝试的基本上是这样的:
context 'user is not logged in' do
before do
Rails.application.config.action_controller.allow_forgery_protection = true
end
it 'does not blow up' do
expect { post :destroy, {}, { some_key: 'val' } }.not_to raise_error
end
it 'redirects to logout path' do
expect(response).to redirect_to(successful_logout_path)
end
end
尽管我的控制器没有任何逻辑更改,但仍然是绿色的,并且手动测试确认它仍然无法正常工作。
有关如何为此上下文启用CSRF验证的任何建议,或在单元测试中测试此方法的其他方法?
答案 0 :(得分:0)
Devise在去年之前遇到了类似的问题。我在这里向Github提交了一个问题:https://github.com/plataformatec/devise/issues/2934并且最终修复了。这个问题可以帮到你:InvalidAuthenticityToken in Devise::SessionsController#destroy (sign out after already having signed out)