[RUBY] Générer un mot de passe de compte de test à l'aide de Rails SecureRandom.alphanumeric

Je crée une application avec des rails. J'ai eu une erreur lorsque j'ai implémenté la fonction de connexion avec un compte de test, alors gardez une trace de la solution que j'ai prise.

Environnement de développement

Ruby 2.6.5 Rails 6.0.3.3

Détails d'implémentation

J'ai implémenté la fonction de connexion de test avec le code suivant.

`` Contrôleur ''


class Users::SessionsController < Devise::SessionsController
  #Connectez-vous en tant qu'utilisateur invité
  def new_guest
    user = User.find_or_create_by!(nickname: 'Utilisateur invité', email: '[email protected]') do |user|
    user.password = SecureRandom.alphanumeric
    end
    sign_in user
    redirect_to root_path, notice: 'Vous vous êtes connecté en tant qu'utilisateur invité.'
  end
end

`` Modèle ''

 #Définir la validation pour autoriser uniquement les caractères alphanumériques demi-largeur
  PASSWORD_REGEX = /\A(?=.*?[a-z])(?=.*?[\d])[a-z\d]+\z/i.freeze
  validates_format_of :password, with: PASSWORD_REGEX, on: :create, message: 'Veuillez inclure les caractères alphabétiques demi-largeur et les nombres demi-largeur dans'

Même dans l'environnement de développement, aucune erreur ne s'est produite et le test a réussi, donc lorsque je l'ai déployé dans l'environnement de production, "Désolé, une erreur s'est produite." S'affiche.

Cause

Parce que `` SecureRandom.alphanumeric '' a émis un mot de passe avec seulement des lettres. En premier lieu, Secure Random est expliqué comme suit dans Reference.

Un module qui fournit une interface pour les générateurs de nombres aléatoires sécurisés. Convient aux clés de session HTTP, etc.

Et «alphanumérique» est une sorte de méthode du module SecureRandom, qui génère des caractères alphanumériques aléatoires. Cependant, il n'est pas toujours généré en mélangeant des caractères alphanumériques.

console


pry(main)> SecureRandom.alphanumeric
=> "NNCMHbfUbHRQmbwW"

La probabilité n'est pas élevée, mais comme mentionné ci-dessus, un mot de passe avec seulement des lettres peut être généré.

Solution


class Users::SessionsController < Devise::SessionsController
  #Connectez-vous en tant qu'utilisateur invité
  def new_guest
    user = User.find_or_create_by!(nickname: 'Utilisateur invité', email: '[email protected]') do |user|
    user.password = SecureRandom.alphanumeric(10) + [*'a'..'z'].sample(1).join + [*'0'..'9'].sample(1).join
    end
    sign_in user
    redirect_to root_path, notice: 'Vous vous êtes connecté en tant qu'utilisateur invité.'
  end
end

C'est devenu une force brute, mais `` [* 'a' .. 'z'] .sample (1) .join + [* '0' .. '9'] .sample (1) .joinEn réglant, deux caractères de lettres + chiffres sont toujours saisis à la fin du mot de passe afin qu'un mot de passe avec uniquement des lettres ou des chiffres ne soit pas généré.

Recommended Posts

Générer un mot de passe de compte de test à l'aide de Rails SecureRandom.alphanumeric
[Rails] Code de test à l'aide de Rspec
Création d'un flux de test sur CircleCI à l'aide de Jib
[Rails] Comment créer un graphique à l'aide de lazy_high_charts
[Rails] J'ai créé une fonction de brouillon en utilisant enum
Présentation de Rspec, un framework de test pour Ruby on Rails
Comment générer une clé primaire à l'aide de @GeneratedValue
[Rails] Création d'une liste de miettes de pain à l'aide de Gem gretel
[Pour les débutants] Procédure de création d'un contrôleur à l'aide de rails
[Compatible JUnit 5] Ecrire un test en utilisant JUnit 5 avec Spring boot 2.2, 2.3
[Rails / RSpec] Ecrire un test de modèle (avec Shoulda Matchers / FactoryBot)
Comment générer manuellement un JWT avec Knock in Rails