Rails 5:设计Gem密码加密

时间:2018-03-04 15:45:26

标签: ruby-on-rails ruby devise ruby-on-rails-5 password-encryption

我是Rails初学者。我正在尝试使用Devise gem保存密码。不知怎的,我看到使用Bcrypt的问题,根据建议,我选择了Devise。

当我安装Devise并尝试保存密码时,它将保存为简单的简单文本。这是我正在使用的代码。

config.rb

Rails.application.routes.draw do
  devise_for :users #This got added as part of Devise gem usage
  #....  Other different routes
   resources :users, except: [:new] # I am using users controller and generating routes except for new(Sign_up)
   get '/signup', to: 'users#new', as: 'signup' #This is route i wanted for signup
end

以下是我在控制器中使用的代码。

class UsersController < ApplicationController

    def new
        @user=User.new
    end
    def create
        @user=User.new(user_params)
        #@user=User.new(:password => @user.password).encrypted_password
        if @user.save
            flash[:success]="User "+@user.user_name+" created successfully"
            redirect_to users_path
        else
            render 'new'
        end
    end
    private
    def user_params
        params.require(:user).permit(:user_name,:password,:admin)
    end

end

这是我在DB中看到的。

User Load (4.0ms)  SELECT  "users".* FROM "users" LIMIT $1  [["LIMIT", 11]]
=> #<ActiveRecord::Relation [#<User id: 3, user_name: "admin", password: "admin", admin: "1", created_at: "2018-03-03 08:52:19", updated_at: "2018-03-03 08:52:19", sign_in_count: 0, current_sign_in_at: nil, last_sign_in_at: nil, current_sign_in_ip: nil, last_sign_in_ip: nil>, #<User id: 4, user_name: "admin2", password: "admin", admin: "1", created_at: "2018-03-03 08:52:36", updated_at: "2018-03-03 08:52:36", sign_in_count: 0, current_sign_in_at: nil, last_sign_in_at: nil, current_sign_in_ip: nil, last_sign_in_ip: nil>]>

我真的很想知道密码加密的逻辑连接在哪里。作为Rails的新手,我无法理解这是如何发挥作用的。

即使我可以看到last_sign_up,而且ip字段也是零。 Bcrypt会自动执行此操作。

我已经完成了Stackoverflow的一些解决方案,但无法将它们与我的问题联系起来。

这是我的用户模型:

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

#has_secure_password
validates :password, presence: true
validates :user_name, presence: true, uniqueness: true

end

2 个答案:

答案 0 :(得分:3)

Abdul,只需在您的模型devise :database_authenticatable中放置/取消注释即可设计使用密码加密。

class User < ApplicationRecord
  devise :database_authenticatable

  #has_secure_password
  validates :password, presence: true
  validates :user_name, presence: true, uniqueness: true

end

PS:设计使用两个属性:passwordpassword_confirmation

答案 1 :(得分:2)

要更改注册页面的路线,您只需更改路线:

# top level of your routes.rb
Rails.application.routes.draw do
  devise_scope :user do
    # custom path to sign_up/registration
    get "/signup" => "devise/registrations#new", as: "new_user_registration" 
  end

  # Below for all other routes:
  devise_for :users
end

您无需创建自己的控制器来处理注册。你也不应该掌握自己的技能水平,因为在Devise中有很多事情要做,例如签约用户。

您还省略了将Devise模块添加到您的用户模型中,该模型添加了加密密码的回调以及其他内容:

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

我建议您回滚并更仔细地遵循安装步骤。然后添加一些集成测试以确保其正常工作。不要试图重新发明轮子。

之后,您可以尝试customizing it