2012-02-16 13 views
9

Tengo una aplicación simple con un modelo de usuario y un sistema de autenticación creado desde cero. Ahora estoy tratando de usar Devise, y no funciona, y como novato en desarrollo web, hay algo que no entiendo y no sé cómo depurar esto.Idear: el inicio de sesión falla, ¿cómo depurarlo?

Mi problema es: Devise está instalado y funciona, excepto que el inicio de sesión siempre devuelve "correo electrónico no válido o contraseña", incluso si ambos campos son correctos.

He desarrollado una aplicación vacía, he añadido Devise, y no tengo este problema. El problema, probablemente, se deba a que intento agregar Devise a un modelo de Usuario existente.

He leído el documento y la wiki Devise, que tiene un tema sobre este tema: here. dice eliminar: database_authenticatable de los campos de migración, porque el modelo de usuario ya tiene un campo de correo electrónico y reemplazarlo con t.encrypted_password, lo cual hice en la migración.

Ahora, en mi modelo de usuario, dejé: database_authenticatable en attr_accessible. Si lo elimino, tengo muchos mensajes de error de que session_path no se reconoce, etc., pero no se ha migrado. Además,: encrypted_password no aparece en ningún lugar de mi modelo, ¿esto es normal? ...

Sé que es realmente una pregunta para novatos, estoy un poco perdido y no sé si debería volver a escribir mi aplicación de el inicio o si hay una solución fácil ... No sé cómo depurar también, todo lo que veo en los registros es que "no autorizado" aparece cuando el usuario debe iniciar sesión con éxito, y también que "authentication_token" no es el mismo cuando se trata de sign_in que la generada una vez que se ha registrado

así, estoy perdido, si parece obvio para usted, estaría contento de escuchar algún consejo ...

añado por debajo de la routes.rb, User.rb, schema.rb y archivo de migración

routes.rb:

TapaG::Application.routes.draw do 

    devise_for :users 

    get "pages/home" 

    resources :users 
    resources :belongings 

    devise_scope :user do 
    get "sign_in", :to => "devise/sessions#new" 
    get "sign_out", :to => "devise/sessions#destroy" 
    get "sign_up", :to => "devise/registrations#new" 
    end 

    get "pages/more_details" 
    get "pages/infos_pratiques" 
    get "pages/contact_us" 

    #match 'Profil', :to => 'users#Profil' 
    match "more_details", :to => "pages#more_details" 
    match 'contact_us', :to => 'pages#contact_us' 
    match "infos_pratiques", :to => "pages#infos_pratiques" 
    match '/belongings/new', :to => 'belongings#new' 
    root :to => 'pages#home' 

migración:

class AddDeviseToUsers < ActiveRecord::Migration 
    def self.up 
    change_table(:users) do |t| 
     t.recoverable 
     t.rememberable 
     t.trackable 
     t.encrypted_password :null => false, :default => '', :limit => 128 

     # t.encryptable 
     # t.confirmable 
     # t.lockable :lock_strategy => :failed_attempts, :unlock_strategy => :both 
     # t.token_authenticatable 


     # Uncomment below if timestamps were not included in your original model. 
     # t.timestamps 
    end 

    add_index :users, :email,    :unique => true 
    add_index :users, :reset_password_token, :unique => true 
    # add_index :users, :confirmation_token, :unique => true 
    # add_index :users, :unlock_token,   :unique => true 
    # add_index :users, :authentication_token, :unique => true 
    end 

    def self.down 
    # By default, we don't want to make any assumption about how to roll back a migration when your 
    # model already existed. Please edit below which fields you would like to remove in this migration. 
    raise ActiveRecord::IrreversibleMigration 
    end 
end 

User.rb:

class User < ActiveRecord::Base 
    # Include default devise modules. Others available are: 
    # :token_authenticatable, :encryptable, :confirmable, :lockable, :timeoutable and :omniauthable 
    devise :registerable, #:database_authenticatable, 
     :recoverable, :rememberable, :trackable, :validatable 

    # Setup accessible (or protected) attributes for your model 
    attr_accessible :email, :password, :password_confirmation, :remember_me 
    attr_accessor :password 
    attr_accessible :name, :number_of_positive_reco, :confidence_percent, :avatar 

schema.rb:

create_table "users", :force => true do |t| 
    t.string "name" 
    t.string "email" 
    t.integer "number_of_positive_reco" 
    t.float "confidence_percent" 
    t.datetime "created_at" 
    t.datetime "updated_at" 
    t.string "encrypted_password" 
    t.string "salt" 
    t.string "avatar_file_name" 
    t.string "avatar_content_type" 
    t.integer "avatar_file_size" 
    t.datetime "avatar_updated_at" 
    t.boolean "admin",     :default => false 
    t.string "reset_password_token" 
    t.datetime "reset_password_sent_at" 
    t.datetime "remember_created_at" 
    t.integer "sign_in_count",   :default => 0 
    t.datetime "current_sign_in_at" 
    t.datetime "last_sign_in_at" 
    t.string "current_sign_in_ip" 
    t.string "last_sign_in_ip" 
    end 

    add_index "users", ["email"], :name => "index_users_on_email", :unique => true 
    add_index "users", ["reset_password_token"], :name => "index_users_on_reset_password_token", :unique => true 

+0

En realidad, Devise no hace ningún cifrado de contraseña (la contraseña encriptada y la sal se establecen en NIL después de que el usuario se registre) ... – citraL

+0

Ahhh, lo conseguí, gracias por una explicación :) – socjopata

Respuesta

9

La respuesta es: Eliminar attr_accessor: contraseña ... de lo contrario, ¡Devise no puede encriptarlo!

+2

Tuve exactamente el mismo problema, solo que no tenía la línea 'attr_accessor: password'. En mi caso, el problema fue causado porque tenía un 'before_save: encrypt_password', así que encriptaba la contraseña dos veces. Lo dejo aquí en caso de que alguien se encuentre con el mismo problema – Ramses

1

En la consola se puede utilizar el

u = User.last 
u.valid_password? 

Este es un método de contraseña encryptable y le dirá si la contraseña es válida para el usuario dar.

Cuestiones relacionadas