在新增user model時,我們只設定了兩個欄位: name, email,還需要新增password讓user可以驗證登入。
所以我們需要利用migration來修改user model的欄位。
在那之前,我們要先為密碼加密,Rails有一個gem叫作bcrypt可以為我們做這件事。
這個gem會幫我們把密碼轉換成一個難以破解的隨機字串。當user輸入密碼時,密碼會自動轉換,並跟存在資料庫的字串做比對。也就是說,我們不需要儲存用戶原本的密碼,這樣即使被駭客入侵,用戶的資料也不會洩漏。
直接編輯Gemfile將下面這行程式註解掉:
use ActiveModel has_secure_password
gem 'bcrypt', '~> 3.1.7'
並執行$ bundle install安裝這個gem。
要記得,每次修改Gemfile後都要重新執行這個指令。
執行以下程式,在user model新增一個欄位password_digest(密碼文摘,即加密過的密碼)
rails g migration AddUserPasswordDigest
並編輯此檔案,修改change方法,利用migration的add_column方法來修改users table
class AddUserPasswordDigest < ActiveRecord::Migration
def change
add_column :users, :password_digest, :string
end
end
接下來,編輯app/model/user.rb
加入has_secure_password這個方法,這個方法可以暫時儲存密碼即雙重確認密碼(確認密碼只是用於認證的時候,不會儲存到資料庫裡)
class User < ActiveRecord::Base
has_secure_password
end
最後,每當建立或修改migration時,必須執行這個migration來更新資料庫
$ rake db:migrate
rails會自動按照時間戳記來執行尚未執行過的migration,如以下執行結果:
== 20141021160437 CreateUsers: migrating ======================================
-- create_table(:users)
-> 0.0011s
== 20141021160437 CreateUsers: migrated (0.0011s) =============================
== 20141022153736 AddUserPasswordDigest: migrating ============================
== 20141022153736 AddUserPasswordDigest: migrated (0.0000s) ===================