Как автоматически генерировать пароли в Rails Devise?
Я пытаюсь выяснить, как Devise работает с одним из моих проектов для аутентификации пользователей. Существует требование пользователя, чтобы их администратор мог время от времени генерировать партию имени пользователя и пароля пользователя, а затем администратор отправляет своим пользователям новые имя пользователя и пароль.
Предположим, что у администратора есть знание прямого SQL в базе данных MySQL, как могут генерироваться имена пользователей/паролей Devise? Спасибо!
Ответы
Ответ 1
Используйте метод Devise.friendly_token
:
password_length = 6
password = Devise.friendly_token.first(password_length)
User.create!(:email => '[email protected]', :password => password, :password_confirmation => password)
FYI: Devise.friendly_token
возвращает токен из 20 символов. В приведенном выше примере мы прерываем первые password_length
символы сгенерированного токена, используя метод String#first
, который предоставляет Rails.
Ответ 2
Один из вариантов - использовать Devise.generate_token. То есть.
password = User.generate_token('password')
User.create!(:email => '[email protected]', :password => password, :password_confirmation => password)
Этот параметр не был доступен в Devise довольно долгое время. Пожалуйста, обратитесь к другому ответу (friendly_token).
Ответ 3
(быстрое предупреждение: я рельс newb)
Я попробовал generate_token, но он не делает то, что вы думаете (посмотрите на документы)
(Я использую rails 3.0.5 и разрабатываю 1.1.7)
Я обнаружил, что Devise будет генерировать все это для вас в фоновом режиме, когда вы это сделаете:
User.create!(:email => "[email protected]", :password => "password")
Разработчик должен создать зашифрованный пароль и соль для вас. (поп открыть консоль и попробовать ее там)
Ответ 4
Я использую гем devise devise-security
и предъявляю особые требования password_complexity
:
config.password_complexity = { digit: 1, lower: 1, upper: 1 }
Если вы используете этот код: Devise.friendly_token.first(password_length)
для генерации пароля, вы не всегда можете получить пароль, соответствующий вашей сложности.
Поэтому я написал генератор паролей, который будет учитывать вашу password_complexity
и будет генерировать случайный пароль жалобы:
class PasswordGenerator
include ActiveModel::Validations
validates :password, 'devise_security/password_complexity': Devise.password_complexity
attr_reader :password
def initialize
@password = Devise.friendly_token.first(Devise.password_length.first) until valid?
end
end
Вы можете использовать его следующим образом:
PasswordGenerator.new.password # "qHc165ku"