Bonjour,

Je souhaite faire un systeme d'authentification et de création de compte via la gem devise.
Je génère tout ce qu'il faut tout fonctionne bien.
Par contre je voudrais avoir la possibilité de créer des comptes avec des mots de passes vides. (En ayant des comptes avec des mots de passe classiques)

Dans config/devise.rb, j'ai mit la longueur du mot de passe de 0 à 128 :

config.password_length = 0..128

Dans mon modèle User j'ai écrit la méthode suivante : (Pas sur que celà soit nécessaire)

def password_required?
    false
end

Mais après je ne vois pas ce qu'il faut faire.
Si quelqu'un peux m'aider.

Merci d'avance

3 réponses


uTiiZ
Auteur
Réponse acceptée

Je répond à ma propre question si d'autres ont la meme problématique que moi (bien que peut commun de vouloir des comptes sans mot de passe ^^)

Tout d'abord il faut créer un fichier dans lib/devise/strategies (et créer les dossiers s'ils n'existent pas) avec le nom database_authenticatable.rb :

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 devise_create_user.rb ajouter:

t.string   :remember_token

Et enfin dans le model 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

Qu'est-ce que tu entends par des comptes avec des mots de passe classique ?

uTiiZ
Auteur

Juste des comptes avec un login / mot de passe non vide