Devise Warden 401 Несанкционированный, когда неверные учетные данные

У меня есть довольно стандартная процедура входа в систему Devise с:

Посмотреть:

имя_ресурса,:url => путь_сессии (имя_ресурса)) do |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>

И я только что создал sessioncontroller для переноса электронной почты:

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 сброшен Уорденом, но я не мог понять, почему. Пользователь правильно перенаправлен обратно на страницу входа в систему, но сообщение об ошибке не отображается (что является нормальным, поскольку они были стерты перенаправлением)

Что я делаю неправильно?

Спасибо!

РЕДАКТИРОВАТЬ 1:

На данный момент я нашел быстрый взлом. Я добавил это в SessionsController#new

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

Не очень элегантно, но, по крайней мере, у меня есть кое-что.

3 ответа

Решение

Ваше флеш-сообщение не будет установлено, потому что Devise::SessionsController#create вызывает надзирателя для аутентификации, которая, в случае сбоев, вызовет Devise::FailureApp, Ваш контроллер никогда не обрабатывает сценарии сбоев.

Если вам нужно специальное сообщение, вы можете настроить приложение для этого, для этого есть несколько статей в вики Devise, объясняющих, как это сделать.

Но в целом вы можете настроить свои сообщения об ошибках через I18n, и, возможно, есть лучший способ достичь того, чего вы хотите, без необходимости переопределять контроллеры Devise.

Прежде всего, позвольте мне посоветовать вам не переопределять контроллеры Devise:

  1. В этом случае Devise позаботится о том, чтобы преобразовать электронную почту в нижний регистр, поэтому на самом деле нет необходимости перезаписывать create метод.
  2. Ваше приложение будет без проблем поддерживать обновления Devise, если вы будете придерживаться стандарта.

Кроме того, Devise должен автоматически устанавливать ошибку флэш-памяти, убедитесь, что вы отображаете ее в своем представлении.

Код состояния 401 является просто стандартным ответом на неавторизованные запросы.

401 Unauthorized аналогичен 403 Forbidden, но специально для использования, когда требуется аутентификация, но она не прошла или еще не была предоставлена

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

Вы должны определенно рассмотреть вопрос о падении вашего пользовательского контроллера,

ура

Я согласен с Яссой, просто обновите свою версию Devise (с bundle update devise).

Письма без учета регистра уже присутствуют в Devise, просто убедитесь, что у вас есть этот конфиг:

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

В любом случае, поскольку у вас, похоже, отсутствуют некоторые флеш-сообщения и этот конфиг, возможно, будет лучше, если вы просто перезапустите генератор:

rails generate devise:install

Затем вы должны позволить Devise перезаписать некоторые файлы, просто сначала сделайте резервную копию своих файлов.

Другие вопросы по тегам