Réinitialiser le mot de passe depuis la console Rails

92

Lors de l'exécution d'une application, comment sélectionner un utilisateur par adresse e-mail, puis définir le mot de passe manuellement dans rails consolepour Devise?

De plus, où puis-je consulter la documentation pour couvrir plus de détails à cet égard sur la manipulation de comptes lors de l'utilisation de Devise?

éclairer
la source
Valk: where () n'est pas disponible avant les rails 3. Mais, la façon dont vous l'avez fait est bien aussi.
hellion

Réponses:

139

C'est plus ou moins comme vous l'avez décrit :-)

# use mongoid
class User
  include Mongoid::Document
end


# then
user = User.where(email: '[email protected]').first

if user
  user.password = new_password
  user.password_confirmation = new_password
  user.save
end

Mise à jour à partir de 6 ans plus tard :)

La conception moderne permet une syntaxe plus simple, pas besoin de définir le champ de confirmation

user.password = new_password; user.save
# or
user.update_attributes(password: new_password)
Sergio Tulentsev
la source
Ah, hmm. Cela fonctionnerait pour un utilisateur standard, mais dans ce cas, il provient de la table admin_users. Quel est le réglage approprié à tirer de ce tableau par rapport aux utilisateurs? Le paramétrer simplement sur user = AdminUser ... n'a pas fonctionné.
ylluminate
Euh, je ne sais pas, interrogez le modèle AdminUser? Quant à moi, j'ai toujours stocké tous les utilisateurs dans les mêmes tables, avec l'attribut 'roles' assigné.
Sergio Tulentsev
Vous pouvez changer le nom de la collection à laquelle le modèle fait référence avec: la méthode store_in. Donc, pour regarder dans la table admin_users, vous devez ajouter User.store_in 'admin_users' avant ce code. (cette réponse implique l'utilisation de Mongoid)
Sergio Tulentsev
Tentative User.store_in 'admin_users'cependant reçue undefined method. Je ne suis apparemment pas en mesure d'accéder à la table car je reçois un zéro à chaque fois. Qu'en est-il de l'interrogation de la table entière et de simplement obtenir toutes les entrées initialement pour tester pour voir si j'entre dans cette table au départ? (Travailler dans MySQL ici, mais cela ne devrait pas avoir d'importance avec ActiveRecord.)
ylluminate
: store_in fait partie de la gemme mongoïde. Vous pouvez accéder au pilote ruby ​​de bas (er) niveau en appelant User.db
Sergio Tulentsev
55
# $ rails console production
u=User.where(:email => '[email protected]').first
u.password='userpassword'
u.password_confirmation='userpassword'
u.save!
Eric Guo
la source
1
Le dispositif est cuit dans les rails, de sorte que l'utilisation de la confirmation pw est redondante. User.find_by_email('[email protected]').update_attributes(:password => 'password')
copremesis
26

Si vous exécutez ce qui suit dans la console des rails, cela devrait faire l'affaire:

User.find_by(email: 'user_email_address').reset_password!('new_password','new_password')

http://www.rubydoc.info/github/plataformatec/devise/Devise/Models/Recoverable

gstraehle
la source
6
Notez que le point d'exclamation est obsolète, il est juste:User.find_by(email: 'user_email_address').reset_password('new_password','new_password')
IrishDubGuy
1
Notez également que vous devez entrer un mot de passe valide qui confirme les exigences de mot de passe dans la configuration de votre appareil.
zwippie
5

Vous pouvez simplement mettre à jour le champ du mot de passe, pas besoin de mot de passe de confirmation, le dispositif l'enregistrera sous forme cryptée

u = User.find_by_email('[email protected]')
u.update_attribute(:password, '123123')
Kshitij
la source
3

Pour une raison quelconque, (Rails 2.3 ??)

user = User.where(:email => email).first

n'a pas fonctionné pour moi, mais

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

l'a fait.

valk
la source
La raison en est que le where (); n'était pas encore dans les rails 2.3, nous avions l'habitude d'utiliser le find (: all,: conditions => conditions) à l'époque.
dennis
3

1. connectez-vous à la console ralis

$ sudo bundle exec rails console production

2.Ensuite, mettez à jour le mot de passe de l'administrateur

irb(main):001:0> user = User.where("username = 'root'")
irb(main):002:0> u = user.first
irb(main):003:0> u.password="root2014@Robin"
=> "root2014@Robin"
irb(main):004:0> u.password_confirmation="root2014@Robin"
=> "root2014@Robin"
irb(main):005:0> u.save
=> true
irb(main):006:0> exit

3. Actualisez la page de connexion, utilisez le nouveau mot de passe pour vous connecter, profitez-en!

Bonne chance!

Robinwen
la source
Le dispositif est intégré de sorte que l'utilisation de la confirmation pw est redondante. User.find_by_email('[email protected]').update_attributes(:password => 'password')
copremesis
0

Si votre compte est verrouillé à cause d'un trop grand nombre de tentatives de connexion, vous devrez peut-être également faire:

user.locked_at = ''
user.failed_attempts = '0'
user.save!
Enzio
la source