Devise在更新的Rails 3.1应用程序上返回401,略微自定义路由

时间:2011-12-22 19:55:05

标签: ruby-on-rails ruby devise restful-authentication warden

在将我们的应用程序从Rails 2.3.x升级到Rails 3.1.3后,我似乎无法让用户登录我们的管理面板。我正在使用最新版本的Devise,在本文发表时是v1.5.3。

POST路由session#create会返回401响应(并且所有参数看起来都是正确的);当Warden尝试使用Devise的一种策略(:database_authenticatable)来授权用户时,就会发生这种情况。这是我的用户模型。

class User < ActiveRecord::Base
  devise :database_authenticatable, :validatable
  attr_accessible :email, :password, :password_confirmation
end

我的Devise::SessionsController命名空间中有一个被覆盖的:admin(登录只针对管理员,他们有自己的网站布局,因此覆盖)。除了布局之外,控制器没有什么特别之处:

class Admin::SessionsController < ::Devise::SessionsController
  layout "admin"
end

我确实有一些略微定制的路线,这是我为此获得的代码。

devise_for :users, :controllers => { :sessions => 'admin/sessions' }

我的布局标题中有csrf_meta_tag位,而我的ApplicationController中有protect_from_forgery行。当表单重新呈现页面时,表单的错误为空。

我已逐步完成代码(一直到lib/warden/proxy.rb),Warden似乎认为我使用的:database_authenticatable策略无效(Warden's source code for那部分)。用户是一个有效的用户...我已经通过Rails rails console IRB会话从头开始创建它,并使用有效的密码和所有内容。我希望它应该认为有效,对吗?或者我甚至吠叫正确的树?

1 个答案:

答案 0 :(得分:1)

哇,我是个傻瓜。在进入Devise的authenticatable策略后,我清楚地知道在我的devise.rb配置文件(我从另一个项目中复制并调整过)中:username列为authentication_key,并且不应该像:email那样。将其更改为:email,现在可以正常使用。

在一个相关的故事中,我现在对Devise如何与Warden合作有些模糊不清。