2017-02-21 17 views
1

У меня есть модель пользователя и контроллер, у пользователя есть password, password_confirmation и password_digest полей. Я использовал bcrypt рубиновый камень.Rails- не в состоянии сохранить пароль пользователя bcrypt

Когда я создаю пользователя, я предоставляю все вышеупомянутые поля, и пользователь создается. Но пользовательский password не будет сохранен, он будет сохранен в шестнадцатеричной форме в поле password_digest.

Если я хочу изменить только имя пользователя, и когда я открою редактирую пользовательскую форму, в форме есть password и password_confirmation поля пустые. Я должен снова предоставить новый пароль для сохранения пользователя, которого я не хочу.

attr_accessor не помогло.

Вот контроллер моего пользователя:

before_filter :authorize 

    def create 
    @user = User.new(user_params) 
    if @user.valid? 
    @user.password = params[:user][:password] 
    @user.password_confirmation = params[:user][:password_confirmation] 
    @user.save! 
    redirect_to users_path 
    else 
    flash[:error] = @user.errors.full_message 
    render :new 
    end 
    end 

    def edit 
    @user = User.find(params[:id]) 
    end 

    def update 
    @user = User.find(params[:id]) 
    if @user.update_attributes(user_params) 
    redirect_to user_path 
    else 
    render 'edit' 
    flash[:error] = @user.errors.full_messages 
    end 
    end 

    private 
    def user_params 
    params.require(:user).permit(:first_name, :last_name, :emp_id, :email, :password, :password_confirmation) 
    rescue 
    {} 
    end 

Heres моя модель пользователя:

class User < ApplicationRecord 
rolify 
require 'bcrypt' 
has_secure_password 
# other field validations here.... 
validates :password, presence: true 
validates :password_confirmation, presence: true 
end 

и форма редактирования:

<%#= other fields here..... %> 
<%= f.label :Password_for_this_portal %> 
<%= f.password_field :password, :class=>"form-control" %> 
<%= f.label :Confirm_passsword_for_this_portal %> 
<%= f.password_field :password_confirmation, :class=>"form-control" %> 
# ..... submit button here 

Как не переспрашивать для изменения пароля в редактировании пользовательская форма?

+0

Вот как это должен работать, вы не сохраняете пароль в базе данных. он сохраняется как дайджест по соображениям безопасности. – trueinViso

+0

Вы никогда не сохраняете фактический пароль, только дайджест. Таким образом, если ваша база данных взломана, пользовательские пароли не могут быть восстановлены хакером для вывода другого пароля службы. – Maxence

ответ

1

has_secure_password предназначен для проверки достоверности password и password_digest. Тем не менее, в Rails 4.x, есть возможность отключить password проверяемую с:

class User < ApplicationRecord 
    has_secure_password :validations => false 
end 

Вы могли бы быть в состоянии выполнить валидации на create только, такие как:

validates :password, presence: true, :on => :create 
validates :password_confirmation, presence: true, :on => :create 
+0

Спасибо Шеннон, что если я хочу проверить на два метода: скажем, «удалить» и «создать», «: on» не работает для двух методов. – suhasa

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

  • Нет связанных вопросов^_^