我有一个非常标准的Devise登录程序:
查看:
resource_name,:url =&gt; session_path(resource_name))do | f | %GT;<%= f.input :password, input_html: {class: "span6"} %>
<% if devise_mapping.rememberable? -%>
<p><%= f.check_box :remember_me %> Remember me</p>
<% end -%>
<input type="hidden" name="after_sign_in_page" value="<%=@after_sign_in_page%>">
<p><%= f.submit "Sign in", class: "btn btn-success" %></p>
我刚创建了一个会话控制器来封装电子邮件:
class SessionsController < Devise::SessionsController
def create
params[:user][:email].downcase!
super
logger.debug "Errors: #{resource.errors}"
end
具有良好凭据的登录正常。
如果凭据错误,则会使用此日志重定向到登录页面:
Started POST "/users/sign_in" for 127.0.0.1 at 2013-01-10 09:59:44 +0100
Processing by SessionsController#create as HTML
Parameters: {"utf8"=>"✓", "authenticity_token"=>"8eytQkr20JOOOdDvpCWakbmUzNoaHMxK9/BSEVxETik=", "user"=>{"email"=>"nicolas@demoreau.be", "password"=>"[FILTERED]", "remember_me"=>"0"}, "after_sign_in_page"=>"", "commit"=>"Sign in"}
Time zone: (GMT+00:00) UTC, current area: , user to register: , current controller: sessions
Completed 401 Unauthorized in 69ms
Processing by SessionsController#new as HTML
Parameters: {"utf8"=>"✓", "authenticity_token"=>"8eytQkr20JOOOdDvpCWakbmUzNoaHMxK9/BSEVxETik=", "user"=>{"email"=>"nicolas@demoreau.be", "password"=>"[FILTERED]", "remember_me"=>"0"}, "after_sign_in_page"=>"", "commit"=>"Sign in"}
Rendered devise/sessions/_new.html.erb (17.8ms)
Rendered devise/sessions/new.html.erb within layouts/application (19.7ms)
Rendered layouts/_header.html.erb (66.1ms)
Completed 200 OK in 173ms (Views: 98.3ms | ActiveRecord: 0.9ms)
显然,Warden放弃了401,但我无法弄明白为什么。 用户被正确地重定向回登录页面,但没有显示错误消息(这是正常的,因为它们被重定向消除了)
我做错了什么?
谢谢!
编辑1:
现在,我发现了一个快速黑客。我在SessionsController#new
中添加了这个if params[:user]
flash[:alert] = "Incorrect login or password"
end
不是很优雅,但至少,我有一些东西。
答案 0 :(得分:5)
首先,让我建议你不要覆盖Devise控制器:
create
方法。此外,Devise应自动设置闪光错误,确保您在视图中显示它。
状态代码401只是未经授权请求的标准响应。
401 Unauthorized类似于403 Forbidden,但专门用于使用 当需要身份验证并且已经失败或尚未验证时 提供
你一定要考虑放弃你的自定义控制器,
干杯
答案 1 :(得分:3)
我同意jassa,只需更新你的Devise版本(bundle update devise
)。
Devise中已经存在不区分大小写的电子邮件,只需确保您拥有此配置:
# devise.rb
Devise.setup do |config|
config.case_insensitive_keys = [:email ]
end
在任何情况下,由于您似乎缺少一些Flash消息和此配置,如果您只是重新运行生成器,也许会更好:
rails generate devise:install
然后你应该让Devise覆盖一些文件,只要确保你先备份你的文件。
答案 2 :(得分:3)
您的Flash消息不会被设置,因为Devise::SessionsController#create
会调用warden进行身份验证,如果失败,将调用Devise::FailureApp
。您的控制器永远不会处理故障情况。
如果您想要自定义消息,可以自定义失败应用程序,Devise wiki中有一些文章解释了如何执行此操作。
但总的来说,您可以通过I18n自定义失败消息,并且可能有更好的方法来实现您想要的而无需覆盖Devise控制器。