web-dev-qa-db-fra.com

Ensemencement d'utilisateurs avec Devise in Ruby on Rails

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?

22
at.

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'
37
Arun Kumar Arjunan

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'
25
George

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!
11

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}
])
7
Koxzi

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.

5
Victor

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

4
doncadavona

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:

  • Générez un mot de passe aléatoire sécurisé pour l'utilisateur par défaut lorsqu'il est créé.
  • Allez sur ".../admins/sign_in" et cliquez sur"Mot de passe oublié?"lien pour le réinitialiser.
  • Obtenez le lien réinitialiser le mot de passe dans le compte de messagerie par défaut.
  • Définir un nouveau mot de passe.

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.

3
Alex Ventura

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!
1
lacostenycoder

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
0
AnkitG

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")
0
vidur punj

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")
0

Utilisez votre fichier db/seeds.rb pour lancer votre premier utilisateur:

User.create!(email: '[email protected]', 
             password: '123456789', 
             password_confirmation: '123456789')
0
aloucas

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'

0
Bilal A.Awan