38

Rails アプリケーションを使用していますが、devise で大きな問題が発生しています。私はコントローラーを持っています:

class Users::SessionsController < Devise::SessionsController
  prepend_before_filter :require_no_authentication, :only => [ :new, :create ]
  include Devise::Controllers::InternalHelpers

def new
    clean_up_passwords(build_resource)

    respond_to do |format|
      format.html { render :layout => "sessions" }
      format.mobile
    end
  end


    # POST /resource/sign_in
    def create
      resource = User.find_by_email(params[:user][:email])  
      resource = warden.authenticate!(:scope => resource_name, :recall => "#{controller_path}#new")
      set_flash_message :notice, :signed_in
      sign_in_and_redirect(resource_name, resource)
    end

end

問題は、ユーザーがログインしないことです。常にこの行で停止します

resource = warden.authenticate!(:scope => resource_name, :recall => "#{controller_path}#new")

私は実際のgemファイルに大量のロガーを入れて、何も見えないかどうかを確認しましたが、これを修正する方法が本当にわかりません. この行をコメントアウトすると、ユーザーはログインしますが、電子メールがデータベースになく、任意のパスワードで機能する場合は失敗します (これは間違いなく正しい解決策ではありません)。

これを修正するにはどうすればよいですか?

アップデート

これは機能しますが、非常にハックなようです

# POST /resource/sign_in
def create
  resource = User.find_by_email(params[:user][:email])

  redirect_to(new_user_session_path, :notice => 'Invalid Email Address or Password. Password is case sensitive.') and return if resource.encrypted_password.blank?      
  bcrypt   = BCrypt::Password.new(resource.encrypted_password)
  password = BCrypt::Engine.hash_secret("#{params[:user][:password]}#{resource.class.pepper}", bcrypt.salt)
  valid = Devise.secure_compare(password, resource.encrypted_password)
 # resource = warden.authenticate!(:scope => resource_name, :recall => "#{controller_path}#new")
  if valid
    set_flash_message :notice, :signed_in
    sign_in_and_redirect(resource_name, resource)
  else
    redirect_to(new_user_session_path, :notice => 'Invalid Email Address or Password. Password is case sensitive.') and return    
  end

end
4

4 に答える 4

83

ユーザーをサインインさせたい場合はsign_in、コントローラーのアクション内でヘルパーを使用します。

sign_in(:user, user)
于 2012-02-18T17:01:48.330 に答える
1
  resource = warden.authenticate!(:scope => resource_name)
   sign_in(resource_name, resource)
于 2012-05-10T07:04:50.250 に答える
0

標準createアクションの仕組みは次のとおりです。

  # POST /resource/sign_in
  def create
    self.resource = warden.authenticate!(auth_options)
    set_flash_message!(:notice, :signed_in)
    sign_in(resource_name, resource)
    yield resource if block_given?
    respond_with resource, location: after_sign_in_path_for(resource)
  end

https://github.com/plataformatec/devise/blob/master/app/controllers/devise/sessions_controller.rb#L18

于 2019-01-28T16:33:43.057 に答える