DeviseとAuthlogicを使ってみる

2014.05.16

はじめに

Railsでwebサイトを作成するにあたりログイン機能を実装することはよくあるかと思います。
そこで今回は良く使われているDeviseとAuthlogicを使ってみました。
まずはそれぞれの基本機能について比較してみます。

開発環境

Mac OS 10.9
Ruby 2.1.1
Rails 4.1.0
DB SQLite3

Devise

まずはDeviseの基本機能からです。
Railsプロジェクトを作成した後にGemfileに以下を記述します。

 $ gem 'devise'

インストールします。

    $ bundle install
    $ rails g devise:install

インストールしたらgenerateコマンドを実行します。
引数にモデル名を指定します。ここではuserとします。

  $ rails generate devise user

実行するとモデルの他にマイグレーションファイルの生成やルーティングの追加がされます。

DBを作成する

先ほど生成したマイグレーションファイルからDBを作成します。
その前にマイグレーションファイルの中身を見てみましょう。

      ## Database authenticatable
      t.string :email,              null: false, default: ""
      t.string :encrypted_password, null: false, default: ""

      ## Recoverable
      t.string   :reset_password_token
      t.datetime :reset_password_sent_at

      ## Rememberable
      t.datetime :remember_created_at

      ## Trackable
      t.integer  :sign_in_count, default: 0, null: false
      t.datetime :current_sign_in_at
      t.datetime :last_sign_in_at
      t.string   :current_sign_in_ip
      t.string   :last_sign_in_ip

メールアドレス、パスワード情報以外に色々な情報が格納されるのがわかります。
Trackableの項目ではユーザがログインした回数、ログインした日時、前回のログイン日時、現在ログインしているユーザのIPアドレス、前回ログインしたユーザのIPアドレスといった情報まで自動で保存してくれます。
ではDBを作成しましょう。

  $ rake db:migrate

ログイン画面を表示する

サーバを起動します。

  $ rails s

起動した以下にアクセスするとログイン画面が表示されます。
http://localhost:3000/users/sign_in
ログイン画面
ほとんど、何もしないでログイン画面が表示されます。

ユーザを登録してログインできるようにする

まず、ログイン後のトップページを作成します。
ここではトップメージをhomeとします。

  $ rails generate controller home index

追加されたルーティングをrootに変更します。
get 'home/index'

root 'home#index'
このままではトップページはログインしなくてもアクセスできてしまうので、認証機能を追加します。
認証機能はapplication_contoller.rbに追加します。

 before_action :authenticate_user!

次にapplication.html.erbを編集してログイン失敗時のメッセージやログアウトボタンを追加します。

  <p class="notice"><%= notice %></p>
  <p class="alert"><%= alert %></p>
  <% if user_signed_in? %>
    <%= link_to "Sing out", destroy_user_session_path, method: 'delete' %>
  <% end %>

user_signed_in?はdeviseのメソッドでログイン判定をしてくれます。ここではログインしていないときにログアウトリンクを表示させます。
トップページにアクセスしてみましょう。ログインしていない状態なのでログイン画面へ遷移します。
ログインするか、サインアップしろというメッセージも表示されます。

ログインする

Sing upリンクをクリックし、メールアドレス、パスワードを入力して、Sign Upしてみましょう。トップ画面が表示されるかと思います。
deviseのデフォルトの設定ではパスワードは8文字以上でないと登録ができません。

Authlogic

次にAuthlogicについてです。
Railsプロジェクトを作成した後にGemfileに以下を記述します。 authlogic ver3.4.2ではユーザ情報を登録するさいのパスワード暗号化が変更されているようで、scryptもインストールしないとユーザ登録時にエラーとなってしまいます。

  $ gem 'authlogic'
  $ gem 'scrypt'

インストールします。

  $ bundle install

モデルを作成する

 まずはユーザ情報としてDBに登録するモデルを作成します。

  $ rails g model user

生成されたマイグレーションファイルを編集します。
deviseのように自動的に項目は追加されていませんので、以下の項目を追加します。

      t.string    :email,               null: false
      t.string    :crypted_password,    null: false
      t.string    :password_salt,       null: false
      t.string    :persistence_token,   null: false
      t.integer   :login_count,         null: false, default: 0
      t.integer   :failed_login_count,  null: false, default: 0
      t.datetime  :last_request_at
      t.datetime  :current_login_at
      t.datetime  :last_login_at
      t.string    :current_login_ip

DBを作成する

$ rake db:migrate

 実装する

 Authlogicの場合はとりあえず動かす場合もdeviseと違い、ログインする画面など全部自力で実装する必要があります。
ユーザ登録するためのcontrollerとviewを作成します。

  $ rails g controller users

class UsersController < ApplicationController
  skip_before_action :require_user, only: [:new, :create]
  # ユーザ登録が面表示
  def new
    @user = User.new
  end
  # ユーザ登録
  def create
    @user = User.new(user_params)

    if @user.save
      # 登録できたらトップ画面へ遷移
      redirect_to root_url
    else
      render action: :new
    end
  end
  private

    def user_params
      params.require(:user).permit(:email, :password, :password_confirmation)
    end
end
[/ruby]
  <br />ルーティングを設定します。以下を追加します。 

<p>ルーティングを設定します。以下を追加します。 
  
  resource :user_session, only: :create
  get "sign_in" => "user_sessions#new"
  delete "sign_out" => "user_sessions#destroy"

次に認証情報用のモデルを作成します。
modelsディレクトリ配下にuser_session.rbファイルを作成します。

class UserSession < Authlogic::Session::Base end [/ruby] ActiveRecordではなくAuthlogicを継承するようにします。 ログイン画面を作成します。
views/users_sessions配下にnew.html.erbファイルを作成します。

<ul>
  <% @user_session.errors.full_messages.each do |msg| %>
    <li><%= msg %></li>
  <% end %>
</ul>
<%= form_for @user_session, url: user_session_path do |f| %>
    <h2 id="toc-sign-in">Sign in</h2>
    <p>
      <%= f.label :email %>
      <%= f.text_field :email %>
    </p>
    <p>
      <%= f.label :password %>
      <%= f.password_field :password %>
    </p>
    <%= f.submit "Sign in" %>
<% end %>
<%= link_to "Sign up", sign_up_path, method: 'get' %>

ログイン後のトップページを作成します。

  $ rails generate controller home index

追加されたルーティングをrootに変更します。
get 'home/index'

root 'home#index'

ログインする

サーバを起動します。  

  $ rails s

起動した以下にアクセスするとログイン画面が表示されます。
http://localhost:3000/users/sign_in

Sing upリンクをクリックし、メールアドレス、パスワードを入力して、Sign Upしてみましょう。トップ画面が表示されるかと思います。
Authlogicのデフォルトの設定ではパスワードは4文字以上でないと登録ができません。

まとめ

今回は基本的な動作を比較してみました。
動かした感想としてはDeviseは勝手に色々やってくれるので実装が少なくて済む分、少し中身が分かりづらい?という印象を受け、Authlogicはシンプルなものになっていて、そのかわり自分で実装しないといけない箇所は多いといった印象を受けました。
ユーザ登録情報やログイン時のログイン情報の更新についての機能は似ており、自動でパスワードを暗号化してDBに保存し、ログインしたときにはログイン回数などを自動的に更新してくれてとても便利だと感じました。