こんにちは、hachi8833です。Devise Wiki日本語目次その4です。
「単体テストを高速化する」はおすすめです。
原文更新や誤りにお気づきの方は@techrachoまでお知らせください。
もくじリンク
- 「ワークフローのカスタマイズ」
- 「認証方法のカスタマイズ」「OmniAuth」
- 「ビュー/コンテンツのカスタマイズ」「特権/認証」
- 「テスト」「特殊な設定」(本記事)
- 「アプリでのその他の設定」「JavaScript」
- 「他の認証プラグインからの移行」「アップグレード」
テスト
※新しい順に並べ替えてあります。
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
html2hamlやhtml2slimで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)
- Rails4: 古いdeviseのパスワードを新しいdeviseで使う方法
- Rails 3.1.0.rc8にしようとしたらdeviseが違うバージョンのbcryptに依存していてアップデートできない
- [Rails 3] deviseで使うモデルにfind_by_で始まる名前のscopeを定義するとrake db:migrate:resetが通らない
- [Rails 3] 失敗しないmigrationを書こう
- [Rails 3] Appサーバが複数だとdevise_openid_authenticatableで認証できない