テクノロジー
2018年12月28日RailsにおけるDeviseとは?
ログイン機能を簡易的に作成できるDeviseについて学びましょう
ログイン機能を簡単に実装できるDeviseとは?
Deviseとは・機能紹介
DeviseとはRailsで作成したアプリケーションへ簡単に認証機能を実装することができるgem(ライブラリ)の一つです。
ログイン、サインアップなどのログイン機能を1から構築するのはかなり大変ですが、Deviseを利用することで簡単に実装することが出来ます。
認証機能を全て自分で作成しようとすると情報の安全性への不安や作業工数も多くかかってきます。
Deviseを使用すれば上記の部分を簡潔にし解消することができます。
具体的にDeviceでは以下のような機能を実装することが出来ます。
- サインアップ機能
- サインイン機能
- アカウント編集機能
- パスワード変更機能
- メール認証機能
- アカウント凍結機能
Devise導入
実際にDeviseの導入手順を見ていきましょう。
まず始めに、以下のリンクからREADME内にある Getting started
を読んで’Gemfile’に’Devise’を追加します。
Gemfile
に追加ができたら、以下のコマンドを実行し、gem
をインストールしましょう。
$ bundle install
続いて、RailsアプリケーションにDeviseを導入します。
以下のコマンドを実行しましょう。
- やってみましょう!
(コンソール
)
$ rails g devise:install
次に、Deviseを用いて userモデル
を作成します。
- やってみましょう!
(コンソール
)
$ rails g devise user
まずは生成されたマイグレーションファイルを見てみましょう。
その上で 追記
と記載されているところを追記してください。
- やってみましょう!
(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で使用するビューを生成します。
- やってみましょう!
(コンソール
)
$ rails g devise:views
上記のコマンドを実行することで app/views/devise
配下にDeviseで使用するビューが作成されます。
ディレクトリごとに詳細を見ていきましょう。
- sessions:ログイン画面
- registrations:ユーザ登録画面とアカウント編集画面
- confirmations:認証メール再送信するための画面
- passwords:パスワードを変更するための画面
- unlocks:アカウント凍結画面
- shared:Deviseの画面に遷移させるためのリンク
次にuserモデルを開き、メール認証機能をONにするために confirmable
を追記しましょう。
- やってみましょう!
(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デバックで試してみましょう。
- やってみましょう!
(app/controllers/blogs_controller.rb
)
def index
@blogs = Blog.all
binding.pry #ここを追記
end
- やってみましょう!
(コンソール
)
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を使えば ログインしているユーザ
を簡単に返すことができます。