Как мне войти в систему с помощью devise?

У меня есть приложение 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")

Я даже поместил множество логгеров в настоящие файлы гема, чтобы посмотреть, смогу ли я что-нибудь увидеть, но ничего, и я действительно понятия не имею, как это исправить. Если я прокомментирую эту строку, то пользователь войдет в систему, но не сможет, если электронная почта не находится в базе данных и работает для любого пароля (что определенно не является правильным решением)

Как я могу это исправить?

ОБНОВИТЬ

это работает, но кажется очень хакерским

# 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

person Matt Elhotiby    schedule 18.02.2012    source источник


Ответы (4)


Если вы хотите войти в систему пользователя, используйте помощник sign_in внутри действия вашего контроллера:

sign_in(:user, user)
person Ryan Bigg    schedule 18.02.2012
comment
это регистрирует их независимо от того, неверный пароль или нет - person Matt Elhotiby; 18.02.2012
comment
Сначала проверьте user.valid_password?(params[:password]), затем. - person Ryan Bigg; 20.02.2012
comment
Я пробовал именно так, но получил неправильное количество аргументов (2 вместо 0). любая идея? - person ishwr; 03.10.2013
comment
@takodil Возможно, этот метод определяется чем-то другим. Откройте новый вопрос SO и включите свой код. Наряду с этой информацией покажите нам вывод method(:sign_in).source_location и в этом новом вопросе. - person Ryan Bigg; 07.10.2013
comment
@RyanBigg Спасибо за ответ. Я сделал новый вопрос SO. stackoverflow.com/questions/19172935/ Не могли бы вы сказать мне, куда мне поместить метод(:sign_in).source_location ? Благодарность - person ishwr; 07.10.2013
comment
@Trace Допустимый вариант использования для входа пользователя без проверки пароля, например, во время настраиваемого процесса регистрации. - person Caleb; 20.07.2014

Я нашел этот пост полезным для настройки входа в систему для спецификаций запроса. https://makandracards.com/makandra/37161-rspec-devise-how-to-sign-in-users-in-request-specs

module DeviseRequestSpecHelpers

  include Warden::Test::Helpers

  def sign_in(resource_or_scope, resource = nil)
    resource ||= resource_or_scope
    scope = Devise::Mapping.find_scope!(resource_or_scope)
    login_as(resource, scope: scope)
  end

  def sign_out(resource_or_scope)
    scope = Devise::Mapping.find_scope!(resource_or_scope)
    logout(scope)
  end

end

Включите его в свой spec_helper

RSpec.configure do |config|
  config.include DeviseRequestSpecHelpers, type: :request
end

И войдите в систему по мере необходимости

sign_in create(:user, name: 'John Doe')

person Clam    schedule 15.10.2017

Вот как работают стандартные 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

person Artur Beljajev    schedule 28.01.2019

person    schedule
comment
Что должна содержать каждая из этих переменных и как передать имя пользователя и пароль? - person DaveMongoose; 15.03.2019