Les utilisateurs de semis avec Devise dans Ruby on Rails
dans mes environnements de développement et de test, je veux semer la base de données avec un groupe d'utilisateurs. J'utilise Ruby sur Rails v3.2.8 et la dernière Devise. J'ai donc ajouté cette ligne dans mon db/seeds.rb fichier:
User.create(email: 'test@example.com', encrypted_password: '#$taawktljasktlw4aaglj')
Cependant, lorsque je lance rake db:setup
, j'obtiens l'erreur suivante:
râteau abandonnée! Ne peut pas masquer-attribuer des attributs protégés: crypted_password
Quelle est la bonne façon de semences utilisateurs?
11 réponses
Vous devez faire comme ceci:
user = User.new
user.email = 'test@example.com'
user.encrypted_password = '#$taawktljasktlw4aaglj'
user.save!
lisez ce guide pour comprendre ce qu'est une tâche de masse:http://guides.rubyonrails.org/security.html
je me demande pourquoi il faut mettre directement le mot de passe crypté. Vous pourriez faire ceci:
user.password = 'valid_password'
user.password_confirmation = 'valid_password'
Arun a raison. Il est plus facile de le faire dans vos graines.rb
user = User.create! :name => 'John Doe', :email => 'john@gmail.com', :password => 'topsecret', :password_confirmation => 'topsecret'
la méthode Skip comfirmation ne fonctionnera que si vous avez un module conforme dans votre modèle utilisateur sinon supprimez-le
user = User.new(
:email => "admin@xxxxx.xxx",
:password => "123456",
:password_confirmation => "123456"
)
user.skip_confirmation!
user.save!
C'est une vieille question, mais voici un exemple avec un utilisateur administrateur (à partir de cancancan):
User.create!([
{email: "testadmin@mvmanor.co.uk", password: "testadminuser", password_confirmation: "testadminuser", reset_password_token: nil, reset_password_sent_at: nil, remember_created_at: nil, sign_in_count: 1, current_sign_in_at: "2015-02-06 14:02:10", last_sign_in_at: "2015-02-06 14:02:10", current_sign_in_ip: "127.0.0.1", last_sign_in_ip: "127.0.0.1", admin: true},
{email: "testuser@mvmanor.co.uk", password: "testuseraccount", password_confirmation: "testuseraccount", reset_password_token: nil, reset_password_sent_at: nil, remember_created_at: nil, sign_in_count: 1, current_sign_in_at: "2015-02-06 14:03:01", last_sign_in_at: "2015-02-06 14:03:01", current_sign_in_ip: "127.0.0.1", last_sign_in_ip: "127.0.0.1", admin: false},
{email: "testcustomer@customer.co.uk", password: "testcustomeruser", password_confirmation: "testcustomeruser", reset_password_token: nil, reset_password_sent_at: nil, remember_created_at: nil, sign_in_count: 1, current_sign_in_at: "2015-02-06 14:03:44", last_sign_in_at: "2015-02-06 14:03:44", current_sign_in_ip: "127.0.0.1", last_sign_in_ip: "127.0.0.1", admin: false}
])
Si vous utilisez le dispositif confirmable
module dont vous avez besoin pour faire quelque chose comme:
user = User.new(
email: 'user@domain.com',
password: '123456789',
password_confirmation: '123456789'
)
user.skip_confirmation!
user.save!
skip_confirmation!
appelez juste dire pour concevoir que vous n'avez pas besoin de confirmer ce compte.
L'autre option est de définir le confirmed_at
attribut utilisateur Time.now.utc
avant de l'enregistrer.
Pour les semences de la table users:
User.create(
email: "example@gmail.com",
password: "12345678"
)
concevoir installé, le :password
sera automatiquement hashé et sauvegardé sur :encrypted_password
Je ne sais pas si ça peut aider mais en fait je fais ça pour créer un administrateur par défaut dans mon Rails 5 app mais sans partager le mot de passe en clair dans mon dépôt GitHub.
Fondamentalement, la logique est la suivante:
- générer un mot de passe aléatoire sécurisé pour l'utilisateur par défaut lors de la sélection.
- ".../ admins / sign_in" et cliquez sur " mot de passe oublié?" lien pour RÉINITIALISER.
- Get réinitialiser le mot de passe lien dans ce compte email par défaut.
- Définir un nouveau mot de passe.
dans le db/seeds.rb
ajouter ce qui suit:
randomPassword = Devise.friendly_token.first(8)
mainAdminUser = Admin.create!(email: "me@gmail.com", password: randomPassword, name: "Username")
Et si vous utilisez concevoir confirmable
il suffit de sauter l'option confirmable en faisant ceci:
mainAdminUser = Admin.new(
email: "me@gmail.com",
password: randomPassword,
password_confirmation: randomPassword,
name: "Username"
)
mainAdminUser.skip_confirmation!
mainAdminUser.save!
Et votre bon d'aller!
Maintenant vous avez un utilisateur par défaut mais vous ne partagez pas un mot de passe par défaut! J'espère que cela pourrait être utile pour quelqu'un.
pour les utilisateurs de devise dans seeds.RB file, ce qui a fonctionné pour moi était d'utiliser un mot de passe générique lors de la sauvegarde du nouvel utilisateur. Puis mettre à jour le mot de passe crypté et enregistrer le modèle. C'était un hacky.
user = User.new(
:email => "admin@xxxxx.xxx",
:password => "fat12345",
:password_confirmation => "fat12345"
)
user.save!
user.encrypted_password="ENCRYPT.MY.ASS!!!KJASOPJ090923ULXCIULSH.IXJ!S920"
user.save
mise à JOUR publiés par d'autres et c'est la meilleure manière de le faire:
user = User.new(
email: "foo@bar.com",
password: "foob1234",
password_confirmation: "foob1234"
)
user.skip_confirmation! #only if using confirmable in devise settings in user model.
user.save!
j'ai fait quelque chose de même dans l'une de mes exigences alors il suffit de coller mon snippet
def triggerSeedUsers
p "Starting Seeding Users..."
p "Deleting all users"..
User.destroy_all
normal_users = [{:email => 'abc@domain.com', :login => "abc_demo", :name => 'abc Demo'}]
admin_users = [{:email => 'admin@domain.com', :login => 'abc_admin', :name => 'abc Admin'}]
[normal_users,admin_users].each do |user_type|
user_type.each do |user|
User.create!(:name => user[:name],
:login => user[:login],
:email => user[:email],
:first_login => false,
:password => 'P@ssw0rd',
:password_confirmation => 'P@ssw0rd'
)
end
end
User.where('name LIKE ?', '%demo%').update_all(:is_admin => 0)
User.where('name LIKE ?', '%admin%').update_all(:is_admin => 1)
end
Utilisez votre db / seeds.rb fichier pour lancer votre premier utilisateur:
User.create!(email: 'palo@alto.com',
password: '123456789',
password_confirmation: '123456789')
par e-mail confirmating en db:graine :
User.create!( name: 'John', email:'john@hotmail.com', password: '123456', password_confirmation: '123456',confirmed_at: '2018-08-04 04:51:43', current_sign_in_ip: "127.0.0.1", last_sign_in_ip: "127.0.0.1")