Tech Racho エンジニアの「?」を「!」に。
  • 開発

[Rails] Devise Wiki日本語もくじ4「テスト」「特殊な設定」

こんにちは、hachi8833です。Devise Wiki日本語目次その4です。
「単体テストを高速化する」はおすすめです。

原文更新や誤りにお気づきの方は@techrachoまでお知らせください。

もくじリンク

  1. 「ワークフローのカスタマイズ」
  2. 「認証方法のカスタマイズ」「OmniAuth」
  3. 「ビュー/コンテンツのカスタマイズ」「特権/認証」
  4. 「テスト」「特殊な設定」(本記事
  5. 「アプリでのその他の設定」「JavaScript」
  6. 「他の認証プラグインからの移行」「アップグレード」

テスト

※新しい順に並べ替えてあります。

Rails 3とRails 4のコントローラをRSpecでテストする

27 Apr 2017 · 25 revisions
How To: Test controllers with Rails 3 and 4 (and RSpec)

RSpec以外にminiTestについても書かれています。Devise自身のコントローラテストコードを参考にするのがよいとのことです。Deviseのユーティリティメソッドを使っているとController specはそのままでは動かないので、テストヘルパーの修正が必要です。Rails 3でのルーティングやscaffoldについての注意事項もあります。

Capybaraでテストする

9 Feb 2017 · 28 revisions
How To: Test with Capybara

CapybaraやFactoryGirlを使ってビューをテストする方法です。capybara-webkitとWardenのlogin_asが衝突した場合の回避方法や、Capybara/Rack::TestではログインできるのにCapybara/Seleniumではログインできない場合の対処、Poltergeist利用時にJavaScriptを有効にするとlogin_asが動かない問題の対応方法も紹介されています。

OmniAuth: 結合テスト

12 Nov 2016 · 21 revisions
OmniAuth: 結合テスト原文

OmniAuthをモック化する方法を紹介しています。元記事は実際にはOmniAuthのWikiにあります。

単体テストを高速化する(超おすすめ

18 Jul 2016 · 5 revisions
Speed up your unit tests

たった1行設定を書くだけで単体テストを簡単に高速化できます。他の記事でも「この高速化は絶対やっておけ」と書かれています。

controller specでスタブ認証する

5 Nov 2015 · 12 revisions
How To: Stub authentication in controller specs

コントローラのテストでActiveRecordにアクセスする代わりにスタブ認証を使い、テストのデータベースへの依存を減らして高速化する方法が紹介されています。この方法は改善の余地があるそうです。

Cucumberでテストする

13 Jul 2014 · 20 revisions
How To: Test with Cucumber

Cucumberでサインアウトをテストする方法を解説しています。また、Capybaraで認証する方法やWardenで認証する方法、テスト中のページリダイレクトをCucumberでテストする方法も紹介されています。

DeviseとMachinistでRSpecを使う

10 Dec 2011 · 1 revision
How To: Rspec with devise and machinist

fixtureをmachinist gemに替えて行う方法が紹介されています。なおmachinistはRails 3.2までしかテストされていないようです。

特殊な設定

※新しい順に並べ替えてあります。

ビューをhamlやslimで作成する

7 Jun 2017 · 8 revisions
How To: Create Haml and Slim Views

html2hamlhtml2slimでDevise用のビューを生成する方法です。Devise 1.2以降、HamlやSlimのビューを生成する機能は削除されています。

Userモデルに:confirmableを追加する

23 May 2017 · 38 revisions
How To: Add :confirmable to Users

新規または既存のアプリのUserモデルでDeviseの:confirmableを有効にする方法です。確認が終わってないユーザーにも一定期間アクセスを許す方法も紹介されています。

メールをバックグラウンド送信する(Resque、Sidekiq、Delayed::Job)

23 Aug 2016 · 7 revisions
How To: Send devise emails in background (Resque, Sidekiq and Delayed::Job)

devise-asyncというgemを使います。Devise 2.1.1以前と以後で方法が少し異なります。少なくともSidekiqではconfigにActionMailerの#mailerを設定する必要があります(参考: Sidekiq advanced-options)。

ユーザー登録のタイムアウト値を動的に設定する

22 Aug 2016 · 9 revisions
How To: Add timeout_in value dynamically

Userモデルに#timeout_inメソッドを定義することで行います。1.daysなどのRailsらしい方法でタイムアウト期間を指定できます。この方法はDevise 1.5.2より前では使えません。

Userモデルに:lockableを追加する

31 Jul 2016 · 4 revisions
How To: Add :lockable to Users

既に運用されているRailsアプリに後からDeviseの:lockableを追加する方法です。

ログイン時のユーザーアカウントステータスのバリデーションをカスタマイズする

1 Dec 2015 · 6 revisions
How To: Customize user account status validation when logging in

ユーザーログイン時に独自のバリデーションを追加する方法です。実装ではUserモデルのactive_for_authentication?に独自のバリデーションロジックを追加しています。Devise認証後、active_for_authentication?はリクエストのたびに呼び出されるので注意が必要です。なおdatabase_authenticatableはログイン時にのみ呼ばれるそうです。

カスタム暗号化メソッドを作成する

13 Jul 2015 · 15 revisions
How To: Create a custom encryptor

サポート対象外の方法でパスワードを暗号化している古いデータベースに対応する方法が紹介されています。Devise 2.1以前と以後で方法が少し異なります。saltが使われていない場合の回避方法も書かれていますが、リスクが増すため推奨されていません。

DeviseをMountable Engineで使う

6 Jan 2015 · 6 revisions
How To: Use devise inside a mountable engine

Mountable engine(Railsに内蔵できる小型アプリ)でDeviseを利用する方法が紹介されています。ただしDeviseを2回以上マウントすることはできません。また、OmniAuthではそのままではうまくいかないので、#2692の回避方法が記載されています。

ユーザーがアカウントを削除できないようにする

2 Jan 2015 · 1 revision
How To: Disable user from destroying their account

ユーザーが自分のアカウントを削除できないようにします。詳しくはlib/devise/rails/routes.rbの#devise_registrationを参照。

マスターパスワードを設定する

22 Oct 2014 · 11 revisions
How To: Configure a master password

任意のユーザーとしてログインできるマスターパスワードの実装方法です。始めに簡単な実装が示されていますが、productionでそのまま使うのはきわめて危険です。どうしてもproductionで使いたい場合のために、Deviseの認証セキュリティをフル導入した実装も紹介されています。

前回使ったパスワードの使い回しを禁止する

7 Nov 2014 · 4 revisions
How To: Disallow previously used passwords

devise_security_extensionというgemを使います。コード例はRails 3 + bcrypt 1.3.4なので、別のバージョンや暗号化手法を使う場合は修正が必要かもしれません。

サブドメインからメールを送信する

31 Jan 2014 · 8 revisions
How To: Send emails from subdomains

Deviseはデフォルトでメインのドメインからメールを送信します。これをサブドメインから送信できるようにする方法とトラブルシューティングが紹介されています。この場合、development環境ではdefault_url_options[:host]にlocalhostを設定する必要があります。

ユーザースキャンをparanoidモードを使ってregisterableで回避する

12 Feb 2014 · 6 revisions
How To: Using paranoid mode, avoid user enumeration on registerable

ユーザーが存在するかどうかをボットなどから不正にチェックされないようにするために、Deviseにparanoidモードが追加されました。paranoidモードをオンにする方法が記載されています。

paranoidモードでは、confirmableモジュール、recoverableモジュール、unlockableモジュールを保護しますが、registerableモジュールは保護していません。バリデーションではメールアドレスやユーザー名が既に使われているかどうかもチェックしており、registerableまで保護するとメールアドレスがユーザー名が登録済みかどうかをユーザーに表示できなくなってしまうためです。

回避方法として「captchaを使う」「ユーザーが何人かまとめて連続作成されたらしばらくそのIPからのアクセスを止める」といった方法があげられていますが、人力でのユーザー存在チェックを止めることまではできません。

Resqueを使うSinatraアプリをDeviseで保護する

29 Jul 2013 · 3 revisions
How To: Protect Resque Web with Devise
Sinatra用の記事です。RescueページにアクセスしたときにDevise認証する方法が紹介されています。resqueはRedisベースのバックグラウンドジョブgemです。

MongoidのAccountモデルにUserを埋め込む

21 Sep 2010 · 1 revision
How To: Embed users in your account model with Mongoid

Mongoidのユーザー管理用モデルがシステムに複数ある場合に、一方を他方に埋め込んで統合する方法です。実装はGistに掲載されています。User#findをむりやりAccount#findに変えるというトリッキーな方法なので注意が必要そうです。

関連記事(Devise)


CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。