使用Devise管理用户会话/注册我需要每次用户登录时,以及在通过设计重定向到主页以进行连接之前执行特定任务(例如,更新此特定用户的users表中的某些字段)用户.
我是否必须覆盖设计SessionsController,如果是,如何?
我已经设置了带有--api标志的Rails 5(5.0.0.rc1)应用程序.它使用Warden进行身份验证.
这一切都有效,除了当Warden身份验证失败时,响应未被正确记录.日志看起来像这样:
Started GET "/widgets.json" for ::1 at 2016-06-14 11:38:20 +0000
Processing by WidgetsController#index as JSON
Completed in 0ms (ActiveRecord: 0.0ms)
Run Code Online (Sandbox Code Playgroud)
或者,在生产中:
I, [2016-06-14T14:12:54.938271 #17625] INFO -- : [db39f895-eeb1-4861-91d0-5d52c124e37a] Completed in 1ms (ActiveRecord: 0.0ms)
Run Code Online (Sandbox Code Playgroud)
它当然应该说Completed 401 Unauthorized in...,但无论出于何种原因,它都不知道响应的状态代码.
Warden身份验证错误被发送到Rack兼容的ActionController::Metal控制器,非常简单:
class UnauthorizedController < ActionController::Metal
include ActionController::Head
def self.call(env)
@respond ||= action(:respond)
@respond.call(env)
end
def respond
head :unauthorized
end
end
Run Code Online (Sandbox Code Playgroud)
它使用基本head方法来响应(不需要渲染任何东西),所以可能它的行为与head在常规Rails控制器中使用的行为相同.但不是.
如果我尝试使用redirect_to ...或render ...(包括相关模块之后)也会发生同样的事情.所以在Rack→Rails→Warden→Warden failure app(控制器)的某个地方,响应的状态代码丢失了.日志知道开始记录请求,并知道它已被处理,因为它显然吐出了"已完成..." - …
在迁移到Rails 5.0.0.beta1时,我发现了很多弃用警告:
DEPRECATION WARNING: env is deprecated and will be removed from Rails 5.0. (called from XXX at YYY)
Run Code Online (Sandbox Code Playgroud)
我试图摆脱它,并试图找到一个替代方案,但在actionpack changelog中找不到任何东西.
有任何想法吗 ?
我有一个使用devise的 Rails 3.0 项目,每次成功登录和每次失败尝试都要求我在数据库中注册。
从设计文档中,我认为我必须扩展,FailureApp但示例只是重定向用户,根本不使用模型。在stackoverflow中,我刚刚发现了这个问题,但仍未得到解答,这并不令人鼓舞
谁能告诉我这种方法是否正确,或者不能以这种方式完成,或者是否有一些更简单的替代方法我错过了?
(我知道还没有代码,我只是在潜入之前寻找一个小的指导)
谢谢。