Railsのdeviseを用いてログイン認証を実装する方法を解説

公開日: 2018.09.25
更新日: 2024.01.29
Railsのdeviseを用いてログイン認証を実装する方法を解説

はじめに

Ruby on RailsでWebアプリケーションを作ったは良いものの、いざ公開するところまできて困るのが、「誰でもアクセスできてしまう」という点です。

ユーザー登録をして、アクセス制限をかけてしまえば良いのですが、この実装が意外と面倒で、自作だと手間がかかります。また、本当に安全なのかどうかも怪しいものです。

そんなときに、deviseを使えば、安全な認証処理を簡単に実装することができるのです。

今回は、Webアプリケーションに認証機能を追加することができるdeviseについて、詳しく解説いたします。

(config/environments/development.rb)
※hostとportを、WebアプリケーションへアクセスするときのURLに合わせてください。

なお、hostとportを分けて記載せず、「{ host:’localhost:3000′ }」という記載方法法でも問題ありません。

2.リダイレクト先URLの設定

ログインされていない場合のリダイレクト先のURLを設定します。つまり、1.で設定したURLに最初にアクセスしたときに表示される画面のURLを設定するわけです。

この設定がなければ、ログインされていない場合やログアウト後の遷移先がありませんので、エラー表示になってしまいます。

遷移先のURL(画面)がなければ、先に作っておきましょう。

ここでは、以下のコマンドでAccessesコントローラーとhelloアクション、goodbyeアクションを生成しました。

[bash]
$ rails g controller Accesses hello goodbye
create app/controllers/accesses_controller.rb
route get ‘accesses/hello’
get ‘accesses/goodbye’
invoke erb
create app/views/accesses
create app/views/accesses/hello.html.erb
create app/views/accesses/goodbye.html.erb
invoke test_unit
create test/controllers/accesses_controller_test.rb
invoke helper
create app/helpers/accesses_helper.rb
invoke test_unit
invoke assets
invoke coffee
create app/assets/javascripts/accesses.coffee
invoke scss
create app/assets/stylesheets/accesses.scss
[/bash]

※アクションに合わせた画面のひな型とそれらの画面で必要なファイルが自動で生成されています。

deviseはそのリダイレクト先に「root_url」を使用しますので、「config/routes.rb」にroot設定をしておかなければいけません。

Rails.application.routes.draw do
:
省略
:
root ‘accesses#hello’ # この行を追加(ただし、すでにroot設定があれば、必須ではありません)
:
end

(config/routes.rb)

3.メッセージ領域の作成

deviseは、ログインやログアウトの操作をした結果をユーザーへ分かりやすく伝えるため、メッセージを表示してくれます。そして、その表示領域については、Webアプリケーション制作者が任意の場所を設定できるようになっています。(逆に言うと、設定しなければ、表示されません)

今回は、分かりやすくするため、「app/views/layouts/application.html.erb」へFor example:で提示されている以下の2行を追記しましょう。


<%= notice %>
<%= alert %>

具体的には、以下のようにbodyタグの中のどこかへ追記してください(※ここでは、一番上に表示するように追記しています)。こうすることで、Webアプリケーションの画面上に、ログインやログアウトしたことを示すメッセージを表示できるようになります。


:
省略
:
<body>
<%= notice %>
<%= alert %>
<%= yield %>
</body>
</html>

(app/views/layouts/application.html.erb)

devise用viewの作成

deviseが提供してくれる種々の画面は、何もしなくても表示されるように内部的な処理がされます。しかし、それらの画面もWebアプリケーションのテイストに合わせてカスタマイズしたい場合があるでしょう。そのため、devise用のviewファイルを生成して変更できるようにすることもできます。

今回はカスタマイズしませんが、devise用のviewファイルにどんなものがあるのかを確認するため、以下のコマンドを使ってviewを生成してみましょう。

rails g devise:views

(出力)↓

invoke Devise::Generators::SharedViewsGenerator
create app/views/devise/shared
create app/views/devise/shared/_links.html.erb
invoke form_for
create app/views/devise/confirmations
create app/views/devise/confirmations/new.html.erb
create app/views/devise/passwords
create app/views/devise/passwords/edit.html.erb
create app/views/devise/passwords/new.html.erb
create app/views/devise/registrations
create app/views/devise/registrations/edit.html.erb
create app/views/devise/registrations/new.html.erb
create app/views/devise/sessions
create app/views/devise/sessions/new.html.erb
create app/views/devise/unlocks
create app/views/devise/unlocks/new.html.erb
invoke erb
create app/views/devise/mailer
create app/views/devise/mailer/confirmation_instructions.html.erb
create app/views/devise/mailer/email_changed.html.erb
create app/views/devise/mailer/password_change.html.erb
create app/views/devise/mailer/reset_password_instructions.html.erb
create app/views/devise/mailer/unlock_instructions.html.erb

以上のように数多くの画面(erbファイル)を生成しています。

具体的には、以下のような画面や文章が生成されています。

shared/_links.html.erbリンク用

ファイル名 用途
confirmations/new.html.erb 「認証メール再送信」画面
passwords/edit.html.erb 「パスワード変更」画面
passwords/new.html.erb 「パスワードを忘れた場合のメール送信」画面
registrations/edit.html.erb 「ユーザー情報変更」画面
registrations/new.html.erb 「ユーザー登録」画面
sessions/new.html.erb 「ログイン」画面
unlocks/new.html.erb 「ロック解除メール再送信」画面
mailer/confirmation_instructions.html.erb 「アカウント認証」時のメール用メッセージ
mailer/password_change.html.erb 「パスワード変更完了」時のメール用メッセージ
mailer/reset_password_instructions.html.erb 「パスワードリセット」時のメール用メッセージ
mailer/unlock_instructions.html.erb 「ロック解除」時のメール用メッセージ

ここまでで、deviseの初期設定は完了となります。初めての場合は、ファイルを探したり、記載内容を理解したりと時間がかかったかもしれませんが、慣れてしまえば数分でできますので、非常に手軽です。

ただし、これだけでは、まだ認証機能を使えません。ユーザー情報を登録する準備をしたり、必要な機能を有効にしたりしなければいけません。

ユーザーモデルを生成する

認証処理を行うためには、ユーザー情報の登録が必要です。そのため、ユーザー情報を登録するためのテーブルを、データベース上に作る必要があります。

また、そのテーブルへのデータ登録や変更、削除、認証処理を行うメソッドなどを利用するためのモデルを生成します。

自作でテーブルの作成やモデルを実装するのは手間がかかりますか、deviseであれば、以下のコマンド1行です。

ユーザーのマイグレーションとモデルを生成

rails g devise モデル名 

モデル名は、ユーザー情報を扱う任意の名称で構いませんが、ここでは、hello_userというモデル名で生成していきます。 ※モデル名は必ず小文字単数形の単語を使用してください

rails g devise hello_user

invoke active_record create db/migrate/20180909134145_devise_create_hello_users.rb create app/models/hello_user.rb invoke test_unit create test/models/hello_user_test.rb create test/fixtures/hello_users.yml insert app/models/hello_user.rb route devise_for :hello_users

ここで作られたのは、以下の2ファイルです。 db/migrate/20180909134145_devise_create_hello_users.rbテーブル登録用のマイグレーションファイル

ファイル名 用途
app/models/hello_user.rb ユーザー認証機能を実現するモデルファイル

なお、モデルファイルの内容を確認することで、実装されている機能が分かります。「app/models/hello_user.rb」の内容を確認してみましょう。

class HelloUser
ApplicationRecord
# Include default devise modules. Others available are:
# :confirmable, :lockable, :timeoutable, :trackable and :omniauthable devise :database_authenticatable, :registerable, :recoverable, :rememberable, :validatable end

(app/models/hello_user.rb)

ここで定義されている「database_authenticatable」「registerable」「recoverable」「rememberable」「validatable」が、標準で実行できる機能です。ただし、それ以外にも追加することができる機能がありますので、一覧にしておきます。

ファイル名 用途 搭載
database_authenticatable パスワードの暗号化処理 標準(必須機能)
registerable ユーザー登録・ログイン処理 標準
recoverable パスワードリセット処理 標準
rememberable ログイン情報保持処理(Cookieに保存) 標準
validatable メールアドレス、パスワードの文法チェック処理 標準
trackable ユーザーの履歴保存処理
ログイン回数や、ログイン時間、接続元IPアドレスを記録する
追加機能
confirmable メールによる本登録処理
メールに記載されているURLをクリックして本登録を完了する処理。認証済みユーザーかどうかを検証する
追加機能
lockable ユーザーロック処理
一定回数サインインを失敗するとアカウントをロックする。ロック解除方法も設定可能
追加機能
timeoutable 接続のタイムアウト処理
一定期間アクセスのないユーザーのセッションを破棄する
追加機能
omniauthable intridea/omniauthサポート
TwitterやFacebookなどのSNS認証
追加機能

Webアプリケーションでどんな機能を必要としているかは様々ですので、用途に合わせて、これらの機能を追加、削除することが可能です。

なお、機能の追加や削除を行った場合、データベースに登録する情報も変更されますので、マイグレーションファイルの編集(コメントを外したりコメントアウトしたり)する必要がありますので、忘れないようにしましょう。

テーブルの作成

上記でマイグレーションを作りましたが、マイグレーションはあくまでもデータベースを操作する命令です。
つまり、この時点ではまだテーブルは作られていません。

このままでは、ユーザーを登録することができないため、テーブルを生成するコマンドを実行しましょう。

rake db:migrate

以上で、準備完了です。

あとはユーザー登録やログイン、ログアウトできるようにリンクを配置することで、実装完了です。

先ほど、メッセージ表示を追加した「app/views/layouts/application.html.erb」を以下のように修正しましょう。


<!DOCTYPE html>
<html>
<head>
<title>RailsTest</title>
<%= csrf_meta_tags %&>
<%= csp_meta_tag %&>
<%= stylesheet_link_tag ‘application’, media: ‘all’, ‘data-turbolinks-track’: ‘reload’ %>
<%= javascript_include_tag ‘application’, ‘data-turbolinks-track’: ‘reload’ %>
</head>
<body>
<header>
<nav>
<% if hello_user_signed_in? %>
<strong><%= link_to current_hello_user.username, pages_show_path %></strong>
<%= link_to ‘edit profile’, edit_hello_user_registration_path %>
<%= link_to ‘logout’, destroy_hello_user_session_path, method: :delete %>
<% else %>
<%= link_to ‘registration’, new_hello_user_registration_path %>
<%= link_to ‘login’, new_hello_user_session_path %>
<% end %>
</nav>
</header>
<%= notice %>
<%= alert %>
<%= yield %>
</body>
</html>

変更箇所は、タグの先頭にある

タグの追加です。hello_user_signed_in?メソッドを使ってユーザーがログイン状態かどうかを判定し、ログイン状態であれば、「edit profile」と「logout」のリンク、ログインしていなければ、「registration」と「login」のリンクを表示します。

動作確認

これで、最低限の認証処理を実装できましたので、動作確認をしてみましょう。

改めてWebアプリケーションへアクセスしてみてください。(ローカル環境の場合は、「http://localhost:3000/」です)

以下のように、ヘッダに登録やログインへのリンクが表示された画面が表示されれば成功です。
動作確認画面

「registration」のリンクをクリックして、登録画面へ遷移すると、次のようなシンプルな画面が表示されるでしょう。これは、deviseが自動生成した登録画面です。
自動生成した登録画面

ここで、必要な情報を入力すれば、ユーザー登録できますので、ログインしたり、ログアウトしたりするなどして、動かしてみてください。シンプルな画面ではありますが、動作していることを確認できることでしょう。

ここまで、一つ一つサイトの内容を確認してきたので、時間がかかったかもしれません。しかし、改めて一からやってみると、とても簡単にこれだけの機能を実装できることを実感できると思います。

まとめ

deviseの導入方法と基本的な機能について、紹介しました。

deviseで導入できる認証機能は、一般的なサイトなどで実装されている機能とそん色なく、実用的なものです。つまり、deviseを使うことで一般的な認証処理を効率的に実装できるということです。

認証処理というのは、Webサービスを運営する上でとても重要なものですが、数多くのサイトで同様の実装がされているものです。そんな一般的な部分だからこそ、deviseを使って効率化し、サービス部分にリソースを集中する方が良いでしょう。

ぜひ、deviseを利用して、効率的に安全な認証処理を実装していってください。

・deviseは、認証機能を追加できるgem
・deviseの導入には、「インストール」「初期設定」「ユーザーモデルの登録(マイグレーションとモデルの追加)」「データベースへのテーブル追加」が必要
・deviseには10の機能があるが、標準では4つのみ有効になっている
・deviseの機能を有効/無効にするには、マイグレーションとモデル、両方の修正が必要
・標準の画面表示はシンプルなので、カスタマイズするには、viewの生成が必要

関連記事

資料請求

  • 短期集中で最速エンジニア転職を実現-転職成功者インタビュー一覧

    DMM WEBCAMPでは転職成功率98%を実現しています。本資料では、元警察官や元ラーメン屋など様々なバックグラウンドを持つ卒業生の声をお届けします。

    資料をダウンロードする
  • IT技術がもたらす3つの変化と身につけるべきスキル

    IT技術の発展により、今後10~20年程度で47%の仕事がなくなると言われています。どのような変化が訪れ、私達はどのようなスキルを身につけるべきかを解説します。

    資料をダウンロードする
  • 未経験がフリーランスエンジニアになる方法-年収アップで自由な働き方を手に入れる

    働き方改革やリモートワークの影響でフリーランスという働き方の人気は高まりつつあります。フリーランスエンジニアとして活躍するために必要な情報をお届けします。

    資料をダウンロードする

© 2024 WEBCAMP MEDIA Powered by AFFINGER5