Man*_*rer 5 ruby-on-rails devise ruby-on-rails-3
我正在使用Devise 1.3.4对我的应用程序中的后端进行身份验证.几天后我不能再登录了.会发生什么:
我检查了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)
我最近遇到了类似的问题,那是因为我玩过会话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)
好吧,经过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.redis了AppConfig.redis.to_hash,一切又开始工作了。显然,阻止我登录的问题是我的用户的会话 cookie 仍然存在。(或者有人有更好的解释吗?)。仍然奇怪的是,Devise 既没有抛出适当的异常,也没有覆盖会话 cookie。