テクノロジー

2018年12月28日
  • #ログイン
  • #Rails

RailsにおけるDeviseとは?

Aws4 request&x amz signedheaders=host&x amz signature=5a9c60cffd5e91658344ee50a00d3a55adc1d1226cd7c2c4456edb0570a7d8d3

ログイン機能を簡単に実装できるDeviseとは?

Deviseとは・機能紹介

DeviseとはRailsで作成したアプリケーションへ簡単に認証機能を実装することができるgem(ライブラリ)の一つです。

ログイン、サインアップなどのログイン機能を1から構築するのはかなり大変ですが、Deviseを利用することで簡単に実装することが出来ます。
認証機能を全て自分で作成しようとすると情報の安全性への不安や作業工数も多くかかってきます。

Deviseを使用すれば上記の部分を簡潔にし解消することができます。

具体的にDeviceでは以下のような機能を実装することが出来ます。

  • サインアップ機能
  • サインイン機能
  • アカウント編集機能
  • パスワード変更機能
  • メール認証機能
  • アカウント凍結機能

Devise導入

実際にDeviseの導入手順を見ていきましょう。

まず始めに、以下のリンクからREADME内にある Getting started を読んで’Gemfile’に’Devise’を追加します。

Devise

Gemfileに追加ができたら、以下のコマンドを実行し、gemをインストールしましょう。

$ bundle install

続いて、RailsアプリケーションにDeviseを導入します。

以下のコマンドを実行しましょう。

  • [x] やってみましょう!

(コンソール)

$ rails g devise:install

次に、Deviseを用いて userモデル を作成します。

  • [x] やってみましょう!

(コンソール)

$ rails g devise user

まずは生成されたマイグレーションファイルを見てみましょう。

その上で 追記 と記載されているところを追記してください。

  • [x] やってみましょう!

(db/migrate/YYYYMMDDhhmmss_devise_create_users.rb)

class DeviseCreateUsers < ActiveRecord::Migration
  def change
    create_table :users do |t|
      ## Database authenticatable
      t.string :email,              null: false, default: ""
      t.string :encrypted_password, null: false, default: ""
      t.string :name #追記
      t.string :icon #追記

      ## 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.inet     :current_sign_in_ip
      t.inet     :last_sign_in_ip

      ## Confirmable
      t.string   :confirmation_token #追記
      t.datetime :confirmed_at #追記
      t.datetime :confirmation_sent_at #追記
      t.string   :unconfirmed_email #追記

      t.timestamps null: false
    end

    add_index :users, :email,                unique: true
    add_index :users, :reset_password_token, unique: true
    add_index :users, :confirmation_token,   unique: true
  end
end

次にDeviseで使用するビューを生成します。

  • [x] やってみましょう!

(コンソール)

$ rails g devise:views

上記のコマンドを実行することで app/views/devise 配下にDeviseで使用するビューが作成されます。

ディレクトリごとに詳細を見ていきましょう。

  • sessions:ログイン画面
  • registrations:ユーザ登録画面とアカウント編集画面
  • confirmations:認証メール再送信するための画面
  • passwords:パスワードを変更するための画面
  • unlocks:アカウント凍結画面
  • shared:Deviseの画面に遷移させるためのリンク

次にuserモデルを開き、メール認証機能をONにするために confirmable を追記しましょう。

  • [x] やってみましょう!

(app/models/user.rb)

class User < ActiveRecord::Base
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable, :confirmable #:confirmableを追記

ここまででDeviceの導入は完了です。

Deviseのルーティング確認

以下によく使うルーティングをまとめました。

Deviseのルーティングは自動的に生成されているので、

Railsアプリケーションを起動させてURLにアクセスしてみましょう。

URL HTTPメソッド 動作
/users/sign_up GET ユーザ登録
/users/sign_in GET ログイン
/users/edit GET ユーザ編集
/users/sign_out DELETE ログアウト

各モジュールの概要について

機能 概要
database_authenticatable サインイン時にユーザーの正当性を検証するためにパスワードを暗号化してDBに登録します。
registerable 登録処理を通してユーザーをサインアップします。また、ユーザーに自身のアカウントを編集したり削除することを許可します。
recoverable パスワードをリセットし、それを通知します。
rememberable 保存されたcookieから、ユーザーを記憶するためのトークンを生成・削除します。
trackable サインイン回数や、サインイン時間、IPアドレスを記録します。
validatable Emailやパスワードのバリデーションを提供します。独自に定義したバリデーションを追加することもできます。
confirmable メールに記載されているURLをクリックして本登録を完了する、といったよくある登録方式を提供します。また、サインイン中にアカウントが認証済みかどうかを検証します。
lockable 一定回数サインインを失敗するとアカウントをロックします。ロック解除にはメールによる解除か、一定時間経つと解除するといった方法があります。
timeoutable 一定時間活動していないアカウントのセッションを破棄します。
omniauthable intridea/omniauthをサポートします。TwitterやFacebookなどの認証を追加したい場合は追加します。

ログインしているユーザ

現在ログインしているユーザは current_user というメソッドで取得することができます。
これはDeviseが用意しているメソッドです。
試しにpryデバックで試してみましょう。

  • [x] やってみましょう!

(app/controllers/blogs_controller.rb)

def index
  @blogs = Blog.all
  binding.pry #ここを追記
end
  • [x] やってみましょう!

(コンソール)

pry(#<BlogsController>)> current_user
=> #<User id: 1, email: "hogehoge@example.com", name: "hogehoge", icon: nil, created_at: "2017-01-21 15:23:31", updated_at: "2017-01-21 15:23:31">

このようにDeviseを使えば ログインしているユーザ を簡単に返すことができます。

DIVE INTO CODEのことをもっと知ってみませんか?