Master Devise:Ruby on Rails 認証の基本ガイド
20,000 を超える GitHub スターと多くの統合を備えた Devise gem は、Ruby 環境で最も人気のある gem の 1 つです。では、なぜこれを Ruby の「隠れた」宝石の 1 つと呼ぶのでしょうか?まあ、人気があるにもかかわらず、ほとんどの開発者はライブラリの機能の表面をなぞっただけです。
この 2 部構成のシリーズでは、Devise について詳しく説明します。
この最初のパートでは、次のような基本のいくつかを学習します。
- Devise とは何か、そもそも Devise を使用する必要がある理由、使用しない方がよい状況も含む
- Devise をインストールしてプロジェクトで使用する方法
- プロジェクトに合わせてライブラリをカスタマイズする方法
パート 2 では、次のような Devise のより高度な使用法を見ていきます。
- OmniAuth と API 専用アプリケーション向けの Devise の使用
- Devise と認可ライブラリを統合する
始めましょう!
前提条件
このチュートリアルでは、ユーザーとタスクを特徴とする単純な Ruby on Rails 7 アプリケーションを使用します。ユーザーは create にアクセスして登録、ログイン、ログアウトできます。 、read 、update 、delete 割り当てられた役割に応じて、タスクのアクションを決定します。
このアプリを使用して、より複雑な機能を段階的に構築し、その過程で Devise の強力な機能を実際に披露していきます。
まずは Devise の簡単な紹介から始めましょう。
Ruby 用の工夫の紹介
Devise は、Rack ベースの認証フレームワークである Warden 上に構築された認証ライブラリです。
Warden は、安全なセッション文字列を使用してユーザー セッションを処理し、ログイン ユーザーの身元を確認します。また、そうでないユーザーも処理します。 制限されたリソースにアクセスできないようにするためにログインします。
ただし、Warden は純粋にラックベースであるため、コントローラーのアクション、ビュー、ヘルパー、または適切なユーザー認証ソリューションを構築するために必要なその他の構成オプションは追加されません。一方、Devise はそうします。
Devise のもう 1 つの注目すべき特徴は、そのモジュール性です。このライブラリには、アプリケーションでの認証の処理方法を正確に指定できる約 10 個のモジュールが付属しています。 10 個のモジュールすべてを使用する必要はありません。代わりに、アプリに必要なものだけをアクティベートして使用します。 Registerable を含むこれらのモジュールについては後で説明します。 モジュール、Omniauthable 、Trackable 、その他。
これを念頭に置いて、Tasks アプリの構築を開始し、Devise をインストールしましょう。
はじめに:デバイスのインストール
bundle exec rails new tasks_app を使用して新しい Rails 7 アプリを生成します 。あるいは、リポジトリからサンプル アプリのコードを取得するだけです。
アプリのルート ディレクトリにいることを確認し、bundle add devise を実行します。 。これにより、Devise gem がアプリの Gemfile に追加されます。この後、bundle exec rails g devise:install を実行します。 Devise をインストールし、その初期化ファイルを生成します (このファイルについては、Devise のモジュールを確認するときに詳しく見ていきます)。
このコマンドを実行すると、ジェネレーターは、Devise が期待どおりに動作するためのセットアップの提案もいくつか表示します。与えられた指示に従うだけで準備完了です。
次に、Devise が使用するユーザー モデルを生成しましょう。
デバイス ユーザー モデルの生成
Deviseにはユーザーモデルが必要です。このモデルを何と呼ぶかは好みとアプリのユースケースに完全に依存しますが、通常は User のいずれかになります。 または Admin .
bundle exec rails g devise User を使用して Devise ユーザー モデルを生成してください。 。これにより、User が生成されます。 app/models/user.rb 未満のモデル 、ユーザー テーブルを作成するための移行ファイル、およびユーザー リソースにアクセスするためのルート:
bundle exec rails db:migrate を実行します 移行を実行し、ユーザー テーブルを設定します。これで、あらゆる認証に使用できるユーザー モデルが完成しました。
次に、今後使用するタスク モデルを設定しましょう。
タスク モデルの生成
Devise を使用する場合、この単純なアプリは次のことを行う必要があることに注意してください。
- ユーザーが登録できるようにします。
- ユーザーがアプリにサインインおよびサインアウトできるようにします。
- ユーザーが自分に属するタスクを作成できるようにします。
- ユーザーの役割に応じて、ユーザーによるタスクの操作を許可(または禁止)します。
これを念頭に置いて、ユーザーが操作するタスク モデルを生成しましょう。
これで、作成したユーザー、タイトル、本文、ステータス (完了したかどうかを示す) に関連付けられたタスク モデルが完成しました。
その後、bundle exec rails db:migrate を実行します。 タスクテーブルを作成します。また、タスクをユーザーに関連付けるようにしてください。
スキャフォールド ジェネレーターを実行すると、リレーション belongs_to :users タスク モデルに自動的に追加されます。いずれにしても、enum を使用するようにタスク モデルを編集します。 以下に示すステータス:
これで、Devise をさらに深く掘り下げる準備が整いました。まずは Devise のモジュールの簡単な概要から始めましょう。
Devise for Ruby のモジュール
冒頭で述べたように、Devise の重要な特徴の 1 つはそのモジュール性です。しかし、この場合「モジュール性」とは実際には何を意味するのでしょうか?これは単に、認証プロセスをさまざまな部分に分割し、独立して管理することを意味します。
Devise の最新バージョン (執筆時点) には 10 個のモジュールが含まれています。
<オル>詳細については、Devise のモジュールに関するドキュメントが役立ちます。現時点では、Devise ヘルパーとフィルターに切り替えます。
ヘルパーとフィルターを工夫する
Devise のような認証ライブラリを使用する理由の 1 つは、コントローラー リソースおよび関連するビューへのアクセスを管理するためです。 Devise には、次のような便利なヘルパーのセットがロードされています。
user_signed_in?- 現在ログインしているユーザーがいるかどうかを確認します。current_user- 現在ログインしているユーザーを参照できます。たとえば、current_user.emailのようなコード スニペットを使用できます。 現在ログインしているユーザーのメールアドレスを取得します。user_session- 現在ログインしているユーザーのセッションの場合。destroy_user_session_path- ログインしているユーザーのセッションを破棄し、指定されたパスまたはルート パスにリダイレクトします。new_user_session_path- ユーザー ログイン ビューで応答します。edit_user_registration_path- 現在ログインしているユーザーに、登録の詳細を編集するためのビューへのアクセス権を与えます。new_user_registration_path- 新規ユーザーを登録するための登録フォームを含むビューで応答します。
ヘルパーについてはこれで終わりです。コントローラーへのアクセスを管理するために、Devise は気の利いた before_action を提供します。 次のように使用できるフィルタ:
それでは、Devise が Rails の強力なパラメータとどのように統合されるかに焦点を移しましょう。
Devise と Ruby on Rails の強力なパラメータ
強力なパラメーターは、オブジェクトへのリクエスト パラメーターの一括割り当てを防ぐよく知られた Ruby on Rails の機能です。強力なパラメータでは、割り当てを行う前にリクエスト パラメータを明示的に宣言する必要があります (通常はコントローラ レベル)。
Devise は、適切な Devise 固有のコントローラ アクションでパラメータを明示的に定義することを要求することで、この機能も反映しています。
sign_up- デフォルトでは、これは Devise コントローラDevise::RegistrationsController#createにあります。 。デフォルトで許可されるキーはemailです。 、password、およびpassword_confirmation.sign_in- これはコントローラDevise::SessionsController#newにあります。 、デフォルトで許可されている認証キーemailを使用します。 とpassword.account_update-Devise::Registrations#updateで見つかりました — 認証キーemail、current_password、password、およびpassword_confirmation
独自の認証キーを追加する最も便利な方法は、before_action を使用することです。 ApplicationController でフィルタします 、ここのように、username を追加します。 ユーザーがサインアップするときに必要なキー:
Devise の強力なパラメーターの興味深い使用例は、キーの配列を Devise サニタイザーに渡す必要がある場合です。たとえば、ユーザーが雇用の「請負人」、または他の請負業者を雇用できる「雇用主」、または請負業者と雇用主を同時にできるフリーランサー マーケットプレイス アプリがあるとします。
技術的な詳細にはあまり触れずに、ユーザーがそれぞれの役割 (「請負業者」と「雇用主」) に対応する 2 つの選択ボックスを使用してアカウントを更新できるようにすることで、この機能を実現できます。これにより、ユーザーはいずれかまたは両方のオプションを選択できるようになります。
これを簡単に実現する方法は、キーとしてロールを持つ配列を使用することですが、Rails の強力なパラメータでは次のスカラー値のみが許可されます:String 、Symbol 、NilClass 、Numeric 、TrueClass 、FalseClass 、Date 、Time 、DateTime 、StringIO 、IO 、ActionDispatch::Http::UploadedFile 、Rack::Test::UploadedFile 。ご覧のとおり、配列、ハッシュ、その他のオブジェクトは、デフォルトでは許可されていません。
ユーザーに複数のロールを許可する配列を使用するには、以下に示すようにコードを変更します。
ヘルパーに関する Devise ドキュメントでは、このトピックについてさらに詳しく説明しています。
次に、Devise のビューとコントローラーをカスタマイズする方法を学びます。
デバイスビューのカスタマイズ
Devise は Rails エンジンとして構築されているため、ほとんどすべてのコンポーネントが事前にパッケージ化されています。この良い例には、ログイン、サインアップ、アカウント詳細の更新、パスワードのリセットなどのビューが含まれます。アプリを構築する途中の時点で、ニーズに合わせてこれらの組み込みビューをカスタマイズする必要がある場合があります。
最初のステップは、コマンド bundle exec rails g devise:views を使用してビューを生成することです。 。これを行うと、それぞれのビューが生成され、app/views/devise に配置されます。 フォルダ:

Devise のビューをカスタマイズする実際の例を使用してみましょう。前のセクションでは、Devise サニタイザーに追加の認証キーを追加する方法を学びました。この例を拡張して username を追加しましょう。 フィールドをユーザー登録ビューに追加します。
username 以降 フィールドはデフォルトのユーザー モデルでは使用できません。bundle exec rails g migration add_column_username_to_user username を使用して追加します。 移住。コマンド bundle exec rails db:migrate を実行します。 移行を開始し、ユーザー テーブルに列を追加します。
次に、新しいユーザー登録ファイルを開いて次のように編集します。
すべてのビューを操作している場合は、この方法で Devise ビューを生成しても問題ありません。ただし、いくつかのビューだけをカスタマイズしたいとします。どうすればこんなことができるのでしょうか?ビュー フラグ bundle exec rails g devise:views -v sessions registrations を指定して、必要なビューのリストをジェネレーター コマンドに渡すだけです。 。この場合、ログイン/ログアウト プロセスに関連付けられたビューと、サインアップを処理するビューのみが生成されます。
次に、ライブラリのコントローラとルートをカスタマイズする方法を学び、Devise のカスタマイズをさらに掘り下げてみましょう。
デバイス コントローラとルートのカスタマイズ
Devise のビューをカスタマイズしても、できることは限られています。実際のカスタマイズが必要な場合は、ライブラリのコントローラとルートに入る必要があります。
アプリ上のすべての新規ユーザー登録を通知する電子メールを管理者に送信するとします。 (これは理想的な方法ではありませんが、必要なことを説明するためにこの例を使用してみましょう)。
まず、Devise::RegistrationsController のサインアップ アクションを変更する必要があります。 。通常、Devise のコントローラは編集のために直接アクセスできないため、ビューの場合と同様に、次のように生成できます。
そのコマンドの最後のビットはスコープです - この場合、users 。別のものにしたい場合は、それに応じて変更できます。完了すると、生成されたコントローラーは次のような構造になっているはずです。

次に、ルート ファイルを開いて、コントローラー構造の変更を反映するように Devise のルートを変更します。
次に、新しく生成された Users::RegistrationsController を開きます。 新しいユーザーがサインアップするたびに管理者に電子メールを送信するように変更します。
ご覧のとおり、Devise のコントローラとアクションにアクセスすると、アプリの認証フローを任意の方法で変更できます。
次回:Device の高度な使用法
この 2 部構成のシリーズの最初の部分では、Devise gem の基本について説明しました。私たちは、Devise のさまざまなモジュールと、そのビューとコントローラーをカスタマイズする方法について学びました。
パート 2 では、API 認証や Devise で OmniAuth を使用する方法など、Devise のより高度な使用法について詳しく説明します。
それまで、コーディングを楽しんでください!
追記Ruby Magic の投稿を報道後すぐに読みたい場合は、Ruby Magic ニュースレターを購読して、投稿を 1 つも見逃さないようにしてください。
-
Ruby 3.4 リリースのハイライト:主な機能とアップデート
Ruby の伝統どおり、コア チームは 2024 年 12 月 25 日に Ruby 3.4 をリリースしました。 私たちと同じように Ruby が大好きなら、Ruby 3.4 の新機能が気になるでしょう。このリリースには大きな変更はありませんが、いくつかの非常に優れた点に注意してください。 まず、言語の変更点のいくつかを詳しく見てみましょう。 言語の変更 言語の変更は、ほとんどの Ruby 開発者にとって最も直接的に関係のある変更です。それぞれを簡単に見てみましょう! 凍結された文字列リテラル Ruby を少しでも書いたことがある人なら、おそらく次で始まるファイルを見たことがあるで
-
Rubyを使用してコマンドラインアプリケーション(CLI)を構築する方法
多くの人は、RubyがWebアプリケーションではないことを実行できることを忘れています。この記事では、それを改善するのに役立つコマンドラインアプリケーションを構築する方法を紹介したいと思います! 使い慣れているコマンドラインアプリケーションは次のとおりです。 psql rails bundler gem git コマンドラインアプリケーションを構築する方法はたくさんあります。この記事では、そのうちの3つに焦点を当てます。 あなたは学ぶつもりです : ARGVアレイ OptParseライブラリ トールの宝石 始めましょう! RubyARGV定数 コマンドラインア