シンプルな組み込みの認証機能(1)
Rails 8.0では、シンプルな認証機能がコードジェネレータによって提供されるようになったので、アプリケーションに認証機能を組み込むハードルが下がりました。
メールアドレスとパスワードによる認証をサポートし、認証とセッション管理のためのメソッドの提供と、セッション管理とパスワードリセットのためのコントローラーを備えます。新規ユーザーを登録するサインアップ機能こそ持ちませんが、あらかじめユーザー情報を用意しておけば、少ない手間で認証の必要なアプリを構築できます。
作成されるモデルとコントローラー
コードジェネレータの呼び出しは、rails generate authenticationコマンドです。このコマンドによって、認証機能に必要なテーブルやモデル、コントローラー、ビューが自動生成されます。以下は、authappアプリを作成し、rails generate authenticationコマンドを実行しています。
% rails new authapp % cd authapp % rails generate authentication
作成されるモデルを見ていきます。以下の表に挙げるモデルが作成されます。
モデル | 概要 |
---|---|
User | ユーザーアカウントを格納する。usersテーブルはuniqueインデックス付きのemail_addressフィールドと、ハッシュ化したパスワードを保管するためのpassword_digestフィールドを持つ。 |
Session | セッション管理データを格納する。sessionsテーブルは、usersテーブルへの外部キーとhas_secure_tokenで生成される一意のtokenフィールド、ユーザーのデバイスやネットワークの詳細情報を記録するためのip_addressフィールドとuser_agentフィールドを持つ。 |
Current | リクエスト単位でステートを管理し、user属性(Userモデル)で現在のユーザーの情報へのアクセスを可能にする。 |
また、以下のマイグレーションが作成されます。
- create_usersマイグレーション:usersテーブルを作成する。
- create_sessionsマイグレーション:sessionsテーブルを作成する。
認証機能の利用にはbcrypt Gemが必要になりますが、既定で指定されているので追加は不要です。
以下の表に挙げるコントローラーが作成されます。
コントローラー | 概要 | アクション |
---|---|---|
SessionsController | ユーザーのセッション管理のアクションを処理する。 | new(サインイン)、create(セッション作成)、destroy(セッション破棄) |
PasswordController | パスワードリセットのアクションを処理する。 | new(メール送信フォーム)、create(メール送信)、edit(パスワード変更フォーム)、update(パスワード変更) |
Authentication concern
認証機能の中核となるメソッドは、Authenticationというconcernで実装されています。Applicationコントローラーにて以下のように取り込まれます。
class ApplicationController < ActionController::Base include Authentication # concerns/authentication.rb allow_browser versions: :modern end
ApplicationControllerで取り込まれることで、全てのコントローラーのアクションが認証の対象になります。トップページなど、認証が不要なページでは後述するallow_unauthenticated_accessメソッドをコントローラークラスの冒頭に記述します。
[NOTE]concern
concernとは、Railsアプリ内で同じロジックを複数の場所で再利用するための仕組みです。これにより、コードの整理、管理、保守が容易になります。認証機能を必要とするアクションは一般に複数になりますが、それぞれに実装するのではなくcencernsによって共通化された機能を利用するだけになり、利便性が向上します。ActiveSupport::Concernクラスを拡張して実装されます。
Authenticationには、認証機能で利用できるメソッドが定義されています。主なものを以下の表に挙げます。
メソッド | 概要 |
---|---|
require_authentication | before_action用のコールバック。認証が必要なことを示し、セッションを読み込む。必要であればログインページへ誘導する。 |
resume_session | セッションを復元する。 |
authenticated? | 現在のユーザーにアクティブなセッションがあるか返す。 |
allow_unauthenticated_access | 指定するアクションをrequire_authenticationの対象から外す。 |
after_authentication_url | 認証後のリダイレクト先URLを返す。 |
start_new_session_for(user) | 指定ユーザーの現在のセッションを開始する。 |
terminate_session | 現在のセッションを破棄する。 |