2014-02-18 4 views
0

У меня есть простой модели пользователяУстройство не может войти в

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

    #attr_accessor :password, :password_confirmation 

    has_many :deals 
    has_many :charges 
    has_one :menu 
    has_many :vouchers 
    has_one :authentication 
    has_many :restaurant_tags 
    has_many :restaurant_hours 

    #validates :login, uniqueness: true 
    #validates :login, presence: true 
    validates :password, presence: { on: :create } 
    validates :password, confirmation: true 
    #validates :login, format: { with: /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\Z/i, :on  => :create, message: "must be a valid email address."} 
    validates :role, inclusion: { in: ["admin", "client", "restaurant"] } 

    #before_save :encrypt_password 

    def encrypt_password 
    if password.present? 
    self.salt = BCrypt::Engine.generate_salt 
     self.crypted_password = BCrypt::Engine.hash_secret(password, salt) 
    end 
    end 

    def self.authenticate(login, password) 
    user = find_by_login(login) 
    if user && user.crypted_password == BCrypt::Engine.hash_secret(password, user.salt) 
     user 
    else 
     nil 
    end 
    end 

    def restaurant? 
    role == "restaurant" 
    end 

    def client? 
    role == "client" 
    end 

    def admin? 
    role == "admin" 
    end 

end 

и devise.rb

Devise.setup do |config| 
    config.mailer_sender = "[email protected]" 
    require 'devise/orm/active_record' 
    config.authentication_keys = [ :email, :login] 
    config.case_insensitive_keys = [ :email, login] 
    config.strip_whitespace_keys = [ :email, login ] 
    config.skip_session_storage = [:http_auth] 
    config.stretches = Rails.env.test? ? 1 : 10 
    config.reconfirmable = true 
    config.password_length = 6..128 
    config.reset_password_within = 6.hours 
    config.sign_out_via = :delete 
end 

Я могу подписаться успешно и после подтверждения я могу видеть, я вошел в систему, но когда я выйти а затем попробуйте войти в систему. Я столкнулся с ошибкой. Завершено 401 Несанкционировано в 2 мс. Я уже потратил целый день на это, пожалуйста, помогите мне спасибо

+0

Я вижу, что вы закомментировал 'before_save: encrypt_password' линии, так что вы называете, что меня это откуда-то еще? Если нет, я полагаю, что метод «authenticate» действительно завершился бы неудачно, поскольку исходный пароль не был зашифрован с помощью механизма «BCrypt» (и, следовательно, зашифрованные пароли не совпадают). Это возможно? –

+0

Вы правы, но зашифровываете пароль автоматически, нам не нужно шифровать пароль. –

+0

удалите или прокомментируйте свою собственную аутентификацию от везде, с помощью которой вам не нужно это делать ... и удалите также «include bcrypt». –

ответ

1

Я решил эту проблему, устройство было проверять поле входа для Authenticate в то время как я использовал электронную почту в моих взглядах я просто обновил

config.authentication_keys = [:email] 
config.case_insensitive_keys = [:email] 
config.strip_whitespace_keys = [:email] 

и это решить мою проблему спасибо за помощь

0

пожалуйста, обновите этот метод

def self.authenticate(login, password) 
     user = self.find_by_login(login) 
     if user && user.crypted_password == BCrypt::Engine.hash_secret(password, user.salt) 
      user 
     else 
      nil 
     end 
     end 
+0

благодарит за ответ, но это не работает для меня –

Смежные вопросы