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?