Je voudrais créer une application Web basée sur ruby ​​on rails. Pour l'authentification, j'utilise la gemme devise . Tout va bien: je peux créer des comptes, me connecter, me déconnecter, etc.

Mais ici, j'ai un problème. Je voudrais pouvoir m'inscrire sans fournir de mot de passe, mais j'ai toujours la possibilité de m'inscrire avec un mot de passe pour un autre compte.

J'ai défini la longueur du mot de passe de 0 à 128 sur config / initializers / devise.rb

config.password_length = 0..128

Mais quelles sont les prochaines étapes pour faire ce que je veux?

Je vous remercie

1
utiiz 17 janv. 2017 à 10:46

2 réponses

Meilleure réponse

Ok, je réponds ici comme réponse.

Grâce à Ammar Shah, j'ai compris comment obtenir des utilisateurs avec mot de passe et des utilisateurs sans mot de passe.

Tout d'abord, créez un fichier dans lib / devise / strategies (créez les dossiers) nommé database_authenticatable.rb avec le code suivant:

require 'devise/strategies/authenticatable'

module Devise
  module Strategies
    # Default strategy for signing in a user, based on their email and password in the database.
    class DatabaseAuthenticatable < Authenticatable
      def authenticate!
        if password.blank?
          authentication_hash[:encrypted_password] = ''
        end
        resource  = mapping.to.find_for_database_authentication(authentication_hash)
        hashed = false

        if validate(resource){ hashed = true; resource.valid_password?(password) }
          remember_me(resource)
          resource.after_database_authentication
          success!(resource)
        end

        mapping.to.new.password = password if !hashed && Devise.paranoid
        fail(:not_found_in_database) unless resource
      end
    end
  end
end

Warden::Strategies.add(:database_authenticatable, Devise::Strategies::DatabaseAuthenticatable)

Ensuite, dans la migration de devise_create_user.rb , ajoutez:

t.string   :remember_token

Enfin dans le modèle user.rb :

before_create :remember_value

def valid_password?(password)
    if password.blank?
        true
    else
        super
    end
end

def password_required?
    new_record? ? false : super
end

def remember_value
    self.remember_token ||= Devise.friendly_token
end

Merci Ammar Shah de m'avoir aidé!

1
utiiz 17 janv. 2017 à 14:13

Réinitialisez la longueur du mot de passe dans config / initializers / devise.rb à la valeur par défaut et utilisez cette réponse pour rendre le mot de passe facultatif.

Voici également une implémentation complète de la fonctionnalité d'engagement progressif dans le wiki de devise. Cela dépend exactement de ce que vous voulez réaliser.

0
Community 23 mai 2017 à 12:33