Мне нужно аутентифицировать пользователя непосредственно в консоли под Devise. Как мне это сделать?

Мне нужно сделать что-то подобное из консоли Rails, чтобы выполнить некоторые тесты и эксперименты:

User.authenticate(имя пользователя, пароль)

Я использую Devise, но я понятия не имею, как это сделать.

Я видел здесь другой ответ

Как войти в систему с помощью команды "Разработка" с консоли Rails?

Но мне нужно что-то более чистое и более прямое. Если необходимо, мне нужен алгоритм для хеширования с паролем с солью и сравнить его с encryped_password.

Это так?

User.find(1).valid_password?('password123') 

Ответ 1

Общая информация:

Посмотрите Здесь вы найдете README.

В качестве примера, это вспомогательный метод, который вы можете использовать для этого теста:

class User
    def self.authenticate(username, password)
        user = User.find_for_authentication(:username => username)
        user.valid_password?(password) ? user : nil
    end
end

Проверяя это, я получаю:

1.9.3p194 :001 > user = User.find(1)
    User Load (0.2ms)  SELECT `users`.* FROM `users` WHERE `users`.`id` = 1 LIMIT 1
    User id: 1, {...USER DETAILS SHOWN HERE...}
1.9.3p194 :002 > user.valid_password?('is this it?')=> false

Также работает: User.find(1).valid_password?('1') в консоли Rails:

1.9.3p194 :011 > User.find(1).valid_password?('1')
    User Load (0.3ms)  SELECT `users`.* FROM `users` WHERE `users`.`id` = 1 LIMIT 1
    => false

Для справки, здесь моя настройка Devise для модели User:

class User < ActiveRecord::Base`

  devise :database_authenticatable, :registerable, :timeoutable, :recoverable, :rememberable, :trackable, :validatable

  {...}

end

Как вы сказали в комментариях, нет sessions_controller с Devise. Просмотрите конфигурационный файл Devise в /config/initializers/devise.rb. В зависимости от конфигурации вашего приложения вы также можете посмотреть конфигурацию инициализатора token.rb и session_store.rb.

РЕДАКТИРОВАТЬ: Можете ли вы проверить свою модель пользователя, чтобы увидеть, правильно ли она настроена для этого? Сравните это с моей линией devise. Свойство :validatable может отсутствовать.

EDIT 2: Добавлен вспомогательный метод для этого теста, если вы хотите сделать это за пределами консоли. Проверьте вверх.

Боковое примечание: rails_admin gem очень полезен и может стоить проверить!

Надеюсь, что это поможет.

Ответ 2

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

email: '[email protected]' Текущий пароль: 'rubyuser'

user = User.find_by_email('[email protected]')

user.valid_password?('wrong_password')  #returns false
user.valid_password?('rubyuser')    #returns true