Ruby on Rails – deviseを使ってユーザの認証機能をカンタン実装

Railsで一番有名なユーザ認証機能のGemがdeviseです。

Ruby on Rails チュートリアルではユーザの認証機能をスクラッチで開発しますが、deviseを使うと、カンタンにユーザの認証機能を実装することができます。今回は、deviseを使ってユーザ認証機能を実装してみました!そのときのメモです。

前提条件

deviseのインストール

1. プロジェクトの作成

2. Gemfileを編集してインストール

Gemfileにdeviseを追加

deviseの初期設定

generateコマンドでdeviseをインストール
以下のようなメッセージが表示されるので、それどおりに設定していく

1. デフォルトURLの指定

config/environments/development.rbに以下を記載

2. root_urlの指定

1番で指定したURLにアクセスした際に表示されるページを指定する
まだ、ページがないのでgenerateコマンドで作成する

config/routes.rbを以下のように修正

3. flashメッセージの設定

4. deviseのViewを生成

たくさんファイルが生成される

Userモデルの設定

登録情報を保存するためのモデルを作成していく

1. Userモデルを生成

モデルのgenerateコマンドではなく、deviseのコマンドで生成する

db/migrate/タイムスタンプ_devise_create_users.rbに、以下のようなマイグレーションファイルが生成される

デフォルトでは、

  • Database authenticatable: パスワードを暗号化してDBに保存。認証はPOSTリクエスト or HTTP Basic認証
  • Registerable: ユーザ自身がサインアップ・編集・削除することを許可
  • Recoverable: パスワードをリセットして、それを通知
  • Rememberable: Cookieでユーザのを記憶するトークンを生成・削除
  • Trackable: サインイン回数・時間、IPアドレスを保存
  • Validatable: Emailやパスワードのバリデーション

が、ONになっている

  • Confirmable: メールで配信して、URLクリックしたら本登録
  • Lockable: 一定回数サインインに失敗するとアカウントロック
  • Timeoutable: 一定時間活動してないアカウントのセッションを破棄
  • Omniauthable: TwitterやFacebookの認証を実装するために使用

をONにするには、以下の修正が必要

まず、UserModelを変更する
今回は、omniauthable以外全部実装してみる

次に、マイグレーションファイルを変更する

最後に、マイグレーションコマンドを叩く

Viewの編集

Confirmable – アカウント登録確認メールを送信

1. confirmableとは?

新規登録入力後確認メールを送信して、届いたメールのURLがクリックされるとログイン可能になる仕組み

2. メールの設定

config/initializers/devise.rbに、送信に使用するメールアドレスを設定する

config/environments/development.rbにメールのsftp情報を入力する

ここで注意!
もし設定を間違えていて、535 5.7.0 authentication failed.というエラーが出たら、ソース修正後、Railsのサーバーを必ず再起動する

どうやら、再起動しないと設定ファイルが読み込まれない

3. 届いたメールを確認する

メールを正しく設定できると、サインアップ後に登録したメールアドレス宛に有効化リンクが付いたメールが届く
リンクをクリックすると、ユーザが有効化されてログインできるようになる

app/views/devise/confirmation_instructions.html.erbにてメールの内容を変更できる

Lockable – アカウントをロック

Locableとは?

アカウント認証を一定回数以上間違えると、アカウントロックする機能
うーん、ブルートフォースとか防げるっちゃ防げるけど、
メールリストにヒットしたユーザのアカウントを全部ロックされちゃ困るわな
単純な、嫌がらせは防げるのかな?
ひとまず、実装してみまっしょ

設定方法

config/initializers/devise.rbで以下のような記載をする
今回は、5回ログインに失敗したら、登録したメールアドレスにアンロックのURLを送信するような設定を
maximum_attemptsの数字は、失敗してもいい回数なので4に設定(つまり5回目でNG)

Timeoutable – 一定時間アクセスのないセッションを破棄

Timeoutableとは?

一定時間アクセスがないセッションをタイムアウトにする機能

設定方法

config/initializers/devise.rbにて設定
config.timeout_inに〇〇分後にタイムアウトする時間を設定

アクセス制限をかける

ここまででだいたいサインアップ・サインインの機能を実装した
しかし、全ページにアクセスできてはせっかくの認証の意味がない
そこで、Home#indexにはログインしたユーザしかアクセスできないようにする
ログインしていないユーザがHome#indexつまりrootの画面にアクセスした場合、ログイン画面に遷移するようにせっていする

ログインしていないユーザはログイン画面に強制リダイレクト

app/controllers/application_controller.rbbefore_action :authenticate_user!を追記

各コントローラー毎にも設定できる

まとめ

Railsチュートリアルで結構たいへんなアカウント認証機能づくりですが、deviseを使うとカンタンに実装できました

deviseを利用するとソーシャルログイン機能も実装できる (TODO いつか実装してみる)

Devise + CanCanCan + rolifyを組み合わせることで、ユーザの権限も管理できる (TODO いつか実装してみる)