9

私は非常に標準的なDeviseログイン手順を持っています:

意見:

resource_name、:url => session_path(resource_name))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>

そして、メールをダウンケース化するためのセッションコントローラーを作成しました。

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の更新をシームレスにサポートします。

また、Deviseはフラッシュエラーを自動的に設定する必要があります。ビューに表示されていることを確認してください。

ステータスコード401は、許可されていないリクエストに対する標準的な応答です。

401Unauthorizedは403Forbiddenに似ていますが、特に認証が必要で失敗したか、まだ提供されていない場合に使用します

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

カスタムコントローラーを削除することを確実に検討する必要があります。

乾杯

于 2013-01-22T22:25:52.123 に答える
3

jassaに同意します。デバイスのバージョンを(でbundle update devise)更新するだけです。

大文字と小文字を区別しない電子メールはすでにDeviseに存在します。この構成があることを確認してください:

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

いずれにせよ、いくつかのフラッシュメッセージとこの構成が欠落しているように見えるので、ジェネレーターを再実行した方がよいでしょう。

rails generate devise:install

次に、Deviseにいくつかのファイルを上書きさせる必要があります。必ず、最初にファイルをバックアップしてください。

于 2013-01-25T02:42:41.003 に答える
3

フラッシュメッセージは設定されません。Devise::SessionsController#createこれは、認証のために呼び出しが警告を発し、失敗した場合はを呼び出すためDevise::FailureAppです。コントローラが障害シナリオを処理することはありません。

カスタムメッセージが必要な場合は、そのために失敗アプリをカスタマイズできます。Devisewikiには、その方法を説明する記事がいくつかあります。

ただし、一般に、I18nを介して障害メッセージをカスタマイズでき、Deviseコントローラーをオーバーライドすることなく目的を達成するためのより良い方法がおそらくあります。

于 2013-02-12T14:40:13.110 に答える