Ruby - bcrypt - Resolvido

Estou usando o bcrypt do ruby, para salvar as senhas criptografadas, por este endereço: https://github.com/codahale/bcrypt-ruby.

Quando cadastro usuário pela aplicação a senha funciona e loga.

Criei

namespace :db do
desc 'Criando Usuário’
task create_usuario: :environment do
User.create(email: "administrador@email.com", name: “Administrador”, password: BCrypt::Password.create(“123456”), profile: 0)
end
end

Salva no banco de dados, mas não entra na aplicação após digitar o login e a senha. O que pode ser ?

vamos la

como vc esta comparando as senhas? se simplesmente le a senha como se fosse uma string e comparar como string. isso não vai funcionar. vc precisar ler como um bcrypt password object.

por isso que tem essa parte aqui:

require 'bcrypt'

class User < ActiveRecord::Base
  # users.password_hash in the database is a :string
  include BCrypt

  def password
    @password ||= Password.new(password_hash)
  end

  def password=(new_password)
    @password = Password.create(new_password)
    self.password_hash = @password
  end
end

perceba que ele recomenda que vc tenha um atributo password_hash para salvar a senha pura, enquanto password sera um objeto que pode ser comparado com ==

pelo pouco que vc postou, acho dificil entender onde pode estar o erro mas tudo leva a crer que vc implementou pela metade.

de uma lida aqui também:

https://api.rubyonrails.org/classes/ActiveModel/SecurePassword/ClassMethods.html#method-i-has_secure_password

Model

class User < ActiveRecord::Base
    has_secure_password
    validates :name, presence: true, length: {maximum: 50} #limite de 50 caracters para nome
    validates :password, presence: true, length: {minimum: 6} #minimo de 6 caracters password
    VALID_EMAIL_FORMAT= /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\Z/i
    validates :email, presence: true, length: {maximum: 260}, format: { with: VALID_EMAIL_FORMAT}, uniqueness: {case_sensitive: false}
    validates :profile, presence: true
    before_save { self.email = email.downcase }
end

class SessionsController < ApplicationController
  before_action :block_access, except: [:destroy]
  def new
    @user = User.new
  end
  def create
    @user = User.find_by(email: params[:session][:email].downcase)
    if @user && @user.authenticate(params[:session][:password])
       sign_in(@user)
       redirect_to root_url
    else
      redirect_to root_url, danger: "Email e/ou senha inválido ou inexistente !"
    end
  end
  def destroy
    sign_out
    redirect_to root_url
  end
end

Mas porque quando é preenchido pelo formulário funciona ?

Não consegui compreender o que está escrito e como resolver.

vamos la

https://api.rubyonrails.org/v5.1/classes/ActiveModel/SecurePassword/ClassMethods.html#method-i-has_secure_password

quando vc usa has_secure_password ele chama este codigo

include InstanceMethodsOnActivation

Isso inclui metodos auto-magicamente no seu model como:

https://api.rubyonrails.org/classes/ActiveModel/SecurePassword/InstanceMethodsOnActivation.html#method-i-password-3D

ou seja, o seu model ja esta preparado salvar as senhas encriptadas.

vc não precisa inserir no banco de dados a senha usando bcrypt.

por isso que funciona no formulario e se vc olhar no banco de dados vc vai ver que a senha não esta visivel.

não precisa compreender o que o tutorial te diz, vc tem que ler e entender o codigo q vc esta usando, o que inclui todas as magicas por trás.

lembre-se que ruby tem classes abertas e vc pode adicionar ou modificar metodos a qualquer momento.

O que estou querendo fazer é.

Criar o primeiro usuário para acessar o sistema.

Utilizo este comando: User.create(email: "administrador15@email.com", name: “Administrador”, password: “123456”, profile: 0), no rails console.

Conforme imagem ele salva com a senha criptografada, mas não entra no sistema.

Entendeu ?

Está correto o que eu fiz ?

Alguma ideia para resolver ?

qual é o motivo para não entrar?

vc consegue entrar no console e fazer

u = User.find_by(email: "email que vc cadastrou")
u.authenticate("123456")

o que acontece?

Rodei no rails console, e funcionou normal

User.create(email: "administrador@email.com", name: “Administrador”, password: BCrypt::Password.create(“123456”), profile: 0)

ok, vc conseguiu criar.
vc disse q não consegue logar. e ai?

Desculpe, agora está Ok