ユーザー認証をするための方法です.

準備

Gemfile に以下を記述し, bundle install します:

gem 'bcrypt-ruby', '3.0.1'

モデルに以下のように has_secure_password を記述します:

class User < ActiveRecord::Base
  attr_accessible :name, :email, :password, :password_confirmation
  has_secure_password
end
  • password と password_confirmation は仮想アトリビュートです.

ユーザー作成/編集

通常通りデータを保存をするだけで,
自動的に暗号化されたパスワードが password_digest カラムに格納されます.

コントローラ:

  def create
    @user = User.new(params[:user])
    if @user.save
      sign_in @user
      flash[:success] = "Welcome to the Sample App!"
      redirect_to @user
    else
      render 'new'
    end
  end

  def update
    if @user.update_attributes(params[:user])
      sign_in @user
      flash[:success] = "Profile updated"
      redirect_to @user
    else
      render 'edit'
    end
  end

ビュー:

<%= f.label :name %>
<%= f.text_field :name %>

<%= f.label :email %>
<%= f.text_field :email %>

<%= f.label :password %>
<%= f.password_field :password %>

<%= f.label :password_confirmation, "Confirm Password" %>
<%= f.password_field :password_confirmation %>

ユーザー認証

User モデルのインスタンスメソッド authenticate の引数にパスワードを渡すことによりユーザー認証が出来ます.

user.authenticate("invalid") # => false
user.authenticate("valid") # => #<User (省略)> 

パスワードが正しかったらインスタンス, 正しくなかったら false が返ります.