设计:突然无法再登录了

Man*_*rer 5 ruby-on-rails devise ruby-on-rails-3

我正在使用Devise 1.3.4对我的应用程序中的后端进行身份验证.几天后我不能再登录了.会发生什么:

  • 我转到登录页面/ admin/sign_in
  • 使用良好的凭据登录
  • 在日志中查看登录工作(设置了last_sign_in_at,current_sign_in_at和current_sign_in_ip,增加了sign_in_count)
  • 设计会话控制器尝试将我转发到我在应用程序控制器中指定的after_sign_in_path_for(Admin :: DashboardsController #show)
  • 然后突然再次呈现登录页面.没有重定向,没有任何东西.

我检查了before_filters,它肯定是Devise的autorize_admin_user!导致问题的过滤器(调用之前的过滤器,未调用之后的过滤器).这意味着即使在成功登录后,它也无法识别我已登录.

我意识到在没有看到大部分代码的情况下很难找到解决方案.所以我的第一个问题是:

我该如何调试此错误?如何回溯登录不起作用的位置?我是否需要深入研究守望者?可以是会话/ cookie问题吗?我怎么调试呢?

所有想法都赞赏!

这就是日志所说的:

Started GET "/admin/sign_in" for 127.0.0.1 at 2011-05-20 13:49:11 +0200
[Barista] Compiling all scripts for barista
[Barista] Compiling all coffeescripts
  Processing by Admin::SessionsController#new as HTML
Rendered admin/shared/_header.html.haml (3.1ms)
Rendered admin/shared/_menu.html.haml (1.7ms)
Rendered admin/sessions/new.html.haml within layouts/admin (128.7ms)
Completed 200 OK in 171ms (Views: 133.0ms | ActiveRecord: 0.0ms)


Started POST "/admin/sign_in" for 127.0.0.1 at 2011-05-20 13:49:15 +0200
[Barista] Compiling all scripts for barista
[Barista] Compiling all coffeescripts
  Processing by Admin::SessionsController#create as HTML
  Parameters: {"utf8"=>"?", "authenticity_token"=>"VLjjo6W+sd7yRH3SRSNpUN3L8a+OaOgCUpJgB5VaGEM=", "admin_user"=>{"email"=>"my@email.com", "password"=>"[FILTERED]", "remember_me"=>"0"}, "commit"=>"Sign in"}
  AdminUser Load (0.7ms)  SELECT `admin_users`.* FROM `admin_users` WHERE `admin_users`.`email` = 'admin3@gmail.com' LIMIT 1
  SQL (0.2ms)  BEGIN
  AREL (0.3ms)  UPDATE `admin_users` SET `last_sign_in_at` = '2011-05-20 11:49:15', `current_sign_in_at` = '2011-05-20 11:49:15', `current_sign_in_ip` = '127.0.0.1', `sign_in_count` = 3, `updated_at` = '2011-05-20 11:49:15' WHERE `admin_users`.`id` = 33
  SQL (0.5ms)  COMMIT
Redirected to http://myapp.dev/admin
Completed 302 Found in 160ms


Started GET "/admin" for 127.0.0.1 at 2011-05-20 13:49:15 +0200
[Barista] Compiling all scripts for barista
[Barista] Compiling all coffeescripts
  Processing by Admin::DashboardsController#show as HTML
Completed   in 26ms


Started GET "/admin/sign_in" for 127.0.0.1 at 2011-05-20 13:49:16 +0200
[Barista] Compiling all scripts for barista
[Barista] Compiling all coffeescripts
  Processing by Admin::SessionsController#new as HTML
Rendered admin/shared/_header.html.haml (3.5ms)
Rendered admin/shared/_menu.html.haml (2.0ms)
Rendered admin/sessions/new.html.haml within layouts/admin (134.9ms)
Completed 200 OK in 182ms (Views: 139.2ms | ActiveRecord: 0.0ms)
Run Code Online (Sandbox Code Playgroud)

ami*_*ena 5

我最近遇到了类似的问题,那是因为我玩过会话cookie.我玩过域并将其设置为:domain =>:all in"initializers/session_store.rb".由于此登录在开发环境中停止工作.

如果您对session_store.rb进行了任何更改,那么您可能需要还原这些更改并查看事情是否再次开始工作.如果是这种情况,那么您可以根据环境定义会话存储:

if Rails.env.production?  
  Appname::Application.config.session_store :cookie_store, {:key => '_cookie_name', :domain => :all}  
else  
  Appname::Application.config.session_store :cookie_store, :key => '_cookie_name'  
end
Run Code Online (Sandbox Code Playgroud)


Man*_*rer 5

好吧,经过2天的摸索,我终于找到了答案。

另一个错误同时出现,但首先我没有建立连接。错误是当用户想要注销时,Devise 尝试删除会话 cookie 并使用我的会话存储的配置来找出我的应用程序存储会话 cookie 的位置。现在,我使用的是“应用程序配置”像这样Redis的店我的会话。我的会话存储配置看起来像这样

MyApp::Application.config.session_store :redis_session_store, AppConfig.redis
Run Code Online (Sandbox Code Playgroud)

AppConfig.redis 看起来像

{ :port => 123, :namespace => 'foo' }
Run Code Online (Sandbox Code Playgroud)

问题在于它AppConfig.redis是一个ActiveSupport::HashWithIndifferentAccess,而不是一个Hash。在某些时候,有人试图调用symbolize_keys!它,但它失败了,因为ActiveSupport::HashWithIndifferentAccess没有那个方法。

长话短说:我改成AppConfig.redisAppConfig.redis.to_hash,一切又开始工作了。显然,阻止我登录的问题是我的用户的会话 cookie 仍然存在。(或者有人有更好的解释吗?)。仍然奇怪的是,Devise 既没有抛出适当的异常,也没有覆盖会话 cookie。