9

我有一个非常标准的 Devise 登录程序:

看法:

resource_name, :url => session_path(resource_name)) 做 |f| %>
<%= f.input :password, input_html: {class: "span6"} %>

<% if devise_mapping.rememberable? -%>
    <p><%= f.check_box :remember_me %>&nbsp;&nbsp;&nbsp;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)

显然 401 被 Warden 丢弃了,但我不知道为什么。用户被正确重定向回登录页面,但没有显示错误消息(这是正常的,因为它们被重定向清除了)

我究竟做错了什么?

谢谢!

编辑1:

现在,我找到了一个快速破解方法。我在 SessionsController#new 中添加了这个

if params[:user]
  flash[:alert] = "Incorrect login or password"
end

不是很优雅,但至少,我有一些东西。

4

3 回答 3

5

首先,让我建议您不要覆盖 Devise 控制器:

  1. 在这种情况下,Devise 会为您将电子邮件转换为小写,因此实际上不需要覆盖该create方法。
  2. 如果您坚持标准,您的应用将无缝支持设计更新。

此外,Devise 应该自动设置一个 flash 错误,确保你在你的视图中显示它。

状态码 401 只是对未授权请求的标准响应。

401 Unauthorized 与 403 Forbidden 类似,但专门用于需要身份验证且已失败或尚未提供身份验证时使用

http://en.wikipedia.org/wiki/List_of_HTTP_status_codes

你绝对应该考虑放弃你的自定义控制器,

干杯

于 2013-01-22T22:25:52.123 回答
3

不会设置您的 flash 消息,因为Devise::SessionsController#create调用warden 进行身份验证,如果失败,将调用Devise::FailureApp. 您的控制器从不处理故障情况。

如果您想要自定义消息,您可以为此自定义失败应用程序, Devise wiki中有一些文章解释了如何执行此操作。

但总的来说,您可以通过 I18n 自定义您的失败消息,并且可能有更好的方法来实现您想要的,而无需覆盖 Devise 控制器。

于 2013-02-12T14:40:13.110 回答
3

我同意 jassa,只需更新您的设计版本(带有bundle update devise)。

Devise 中已经存在不区分大小写的电子邮件,只需确保您有以下配置:

# devise.rb
Devise.setup do |config|
  config.case_insensitive_keys = [:email ]
end

无论如何,由于您似乎缺少一些 flash 消息和此配置,所以如果您重新运行生成器可能会更好:

rails generate devise:install

然后你应该让设计覆盖一些文件,只要确保你先备份你的。

于 2013-01-25T02:42:41.003 回答