Dans mes environnements de développement et de test, je souhaite créer un groupe d'utilisateurs dans la base de données. J'utilise Ruby on Rails v3.2.8 et le dernier Devise. J'ai donc ajouté cette ligne dans mon fichier db/seeds.rb:
User.create(email: '[email protected]', encrypted_password: '#$taawktljasktlw4aaglj')
Cependant, lorsque j'exécute rake db:setup
, l'erreur suivante apparaît:
rake avorté! Impossible d'affecter en masse des attributs protégés: mot_de_passe_encrypté
Quel est le bon moyen de générer des utilisateurs?
Vous devez faire comme ça:
user = User.new
user.email = '[email protected]'
user.encrypted_password = '#$taawktljasktlw4aaglj'
user.save!
Lisez ce guide pour comprendre ce qu'est l'affectation en masse: http://guides.rubyonrails.org/security.html
Je me demande pourquoi il faut définir directement le mot de passe crypté. Vous pourriez faire ceci:
user.password = 'valid_password'
user.password_confirmation = 'valid_password'
Arun a raison. C'est plus facile de le faire dans vos graines.
user = User.create! :name => 'John Doe', :email => '[email protected]', :password => 'topsecret', :password_confirmation => 'topsecret'
Ignorer la méthode de confirmation ne fonctionnera que si vous avez un module conforme dans votre modèle utilisateur, sinon supprimez-le
user = User.new(
:email => "[email protected]",
:password => "123456",
:password_confirmation => "123456"
)
user.skip_confirmation!
user.save!
C'est une vieille question mais voici un exemple avec un utilisateur admin (de cancancan):
User.create!([
{email: "[email protected]", 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: "[email protected]", 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: "[email protected]", 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 module schéma confirmable
, vous devez effectuer les opérations suivantes:
user = User.new(
email: '[email protected]',
password: '123456789',
password_confirmation: '123456789'
)
user.skip_confirmation!
user.save!
L’appel skip_confirmation!
indique simplement que vous n’avez pas besoin de confirmer ce compte.
Une autre option consiste simplement à définir l'attribut utilisateur confirmed_at
en tant que Time.now.utc
avant l'enregistrement.
Pour ensemencer la table des utilisateurs:
User.create(
email: "[email protected]",
password: "12345678"
)
Avec inventer installé, le :password
sera automatiquement haché et enregistré dans :encrypted_password
Je ne sais pas si cela peut aider, mais je le fais en réalité pour créer un utilisateur administrateur par défaut dans mon Rails 5 app, mais sans partager le mot de passe en clair dans mon référentiel GitHub.
Fondamentalement, la logique est la suivante:
Donc, dans le db/seeds.rb
, ajoutez ceci:
randomPassword = Devise.friendly_token.first(8)
mainAdminUser = Admin.create!(email: "[email protected]", password: randomPassword, name: "Username")
Et si vous utilisez la fonctionnalité de la règle confirmable
, sautez l’option confirmable en procédant comme suit:
mainAdminUser = Admin.new(
email: "[email protected]",
password: randomPassword,
password_confirmation: randomPassword,
name: "Username"
)
mainAdminUser.skip_confirmation!
mainAdminUser.save!
Et vous êtes prêt à partir!
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 pourra être utile à quelqu'un.
Pour les utilisateurs du fichier seeds.rb, ce qui me convenait était d’utiliser un mot de passe générique lors de la sauvegarde du nouvel utilisateur. Puis mettez à jour le mot de passe crypté et enregistrez à nouveau le modèle. C'était une façon hacky.
user = User.new(
:email => "[email protected]",
:password => "fat12345",
:password_confirmation => "fat12345"
)
user.save!
user.encrypted_password="ENCRYPT.MY.ASS!!!KJASOPJ090923ULXCIULSH.IXJ!S920"
user.save
MISE À JOUR que d'autres ont posté et c'est une meilleure façon de le faire:
user = User.new(
email: "[email protected]",
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 similaire dans l'une de mes exigences alors il suffit de coller mon extrait
def triggerSeedUsers
p "Starting Seeding Users..."
p "Deleting all users"..
User.destroy_all
normal_users = [{:email => '[email protected]', :login => "abc_demo", :name => 'abc Demo'}]
admin_users = [{:email => '[email protected]', :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
avec email confirmant en db: seed:
User.create!( name: 'John', email:'[email protected]', 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")
Cela vous permet d'exécuter une graine plusieurs fois sans erreurs:
User.where(email: "[email protected]").first_or_create.update_attributes(nome: "Your Name",
email: "[email protected]",
password: "password#123",
password_confirmation: "password#123")
Utilisez votre fichier db/seeds.rb pour lancer votre premier utilisateur:
User.create!(email: '[email protected]',
password: '123456789',
password_confirmation: '123456789')
Il suffit d’ajouter: le mot de passe de l’attribut repos, l’imprimante fera mot de passe pour vous
user = User.new({ email: '[email protected]', password: 'EnterYourPassword'})
user.save!
flash[:notice] = 'User Created'
#or for extra logic
#if user.save
#ExtraCredentialsOrLogic
#elsif user.errors.any?
#user.errors.full_messages.each do |msg|
#puts msg
#end
#else
#puts "****NOT VALID****"
#end
et maintenant lancez 'rake db: seed'