Ruby on Rails に向いている認証機能(ログイン・ログアウト等)用の Gem として、Devise と Sorcery が有名です。
Gemとは、Rubyのライブラリ(機能やプログラムをまとめたもの)のことを指します。
これらのGemを使うことで、我々は手間をかけずに認証機能をRailsアプリケーションに導入することができます。
今回はそれぞれのGemの特徴やメリット・デメリットを比較し、どちらを使うべきかを考えていきましょう。
データから見る Devise と Sorcery
どちらも人気の認証 Gem ですが、まずは人気度などのデータを見てみましょう。
本記事執筆時点において、GitHub におけるスター数(お気に入り数)は次の通りです。
GitHub でのスター数はいわば注目度・人気度に相当しますが、スター数だけを見ると Devise が Sorcery の 18倍であることが分かります。
Devise は現代アプリケーションでは必須の機能(パスワードリセット等)を備えていることから実際の現場でもよく使われており、それがスター数にも現れていると推測できます。
Deviseの特徴と使い方
DeviseはRailsの認証ソリューションとして広く知られています。
その特徴は多機能性にあり、あらゆる認証に関する要件を網羅しています。
Deviseのインストール
まずはDeviseのインストールから始めましょう。
Gemfile
に下記の行を追加します。
gem 'devise'
その後、ターミナルでbundle install
を実行し、Deviseをインストールします。
次に、Deviseの初期設定を行います。
ターミナルで下記のコマンドを実行します。
rails generate devise:install
これでDeviseが利用できるようになります。
ユーザーモデルの生成
Deviseを使ってユーザーモデルを生成するには、下記のコマンドを実行します。
rails generate devise User
これでユーザーモデルが生成され、ユーザーの認証機能が追加されます。
ユーザーモデルには、Deviseの10のモジュールが含まれており、それぞれが異なる認証の側面を担当します。
認証の利用
Deviseで提供される認証機能を使用するには、コントローラー内でbefore_action :authenticate_user!
を追加します。
これにより、認証されていないユーザーはログインページにリダイレクトされます。
class SomeController < ApplicationController
before_action :authenticate_user!
...
end
Deviseのデフォルト機能: パスワードのリセット
Deviseはパスワードリセットの機能を提供しています。
これは、ユーザーがパスワードを忘れた場合に新しいパスワードを設定するためのメカニズムです。
この機能を使うためには、Deviseの設定ファイル(config/initializers/devise.rb
)に下記の設定を追加します。
config.recoverable = true
そして、ユーザーモデルに:recoverable
を追加します。
class User < ApplicationRecord
devise :database_authenticatable, :registerable, :recoverable
end
これで、ユーザーがパスワードを忘れた場合、リセットメールを送ることができます。
メール本文には、新しいパスワードを設定するためのリンクが含まれています。
このような機能を自分で実装するには、メールの送信やパスワードのリセットなど、多くのコードを書く必要があります。
しかしDeviseを使うことで、これらの機能を簡単に実装することができます。
Deviseのデフォルト機能: メールアドレスの確認
Deviseでは、ユーザーがメールアドレスを所有していることを確認するための機能も提供しています。
これは、ユーザーが登録時に入力したメールアドレスに確認メールを送り、そのリンクをクリックすることでメールアドレスの所有を証明します。
実際のアプリケーションでも、よく使われている機能です。
この機能を使うためには、設定ファイルに下記の設定を追加します。
config.confirmable = true
そして、ユーザーモデルに:confirmable
を追加します。
class User < ApplicationRecord
devise :database_authenticatable, :registerable, :recoverable, :confirmable
end
これで、ユーザーがサインアップすると、メールアドレスに確認メールが送られます。
ユーザーがそのメール内のリンクをクリックすると、アカウントが確認され、ログイン可能となります。
このような、メールが絡んで本来は複雑な処理もDeviseを入れれば簡単に実装できます。
Sorceryの特徴と使い方
SorceryはDeviseと比べてシンプルで、基本的な認証機能にフォーカスしています。
その結果、パフォーマンスが軽く、カスタマイズしやすいという特性があります。
Sorceryのインストール
SorceryのインストールもDeviseと同様にGemfile
に下記の行を追加します。
gem 'sorcery'
そして、bundle install
でSorceryをインストールします。
ユーザーモデルの生成
Sorceryを使ってユーザーモデルを生成するには、少し手間が必要です。
まず、ユーザーモデルを生成します。
rails generate model User email:string password_digest:string
次に、生成されたユーザーモデルにSorceryの認証メソッドを追加します。
class User < ApplicationRecord
authenticates_with_sorcery!
end
認証の利用
Sorceryで認証機能を利用するには、コントローラーでrequire_login
メソッドを使用します。
これにより、認証されていないユーザーはログインページにリダイレクトされます。
class SomeController < ApplicationController
before_action :require_login
...
end
Deviseのメリット・デメリット
Deviseのメリット: 豊富な機能と使いやすさ
多機能性
Deviseは、多くの認証に関する機能を提供します。
これには、パスワードのリセット、メールアドレスの確認、アカウントのロック、セッションのタイムアウト、ユーザーの追跡、Omni-Auth認証(ソーシャルメディアアカウントを用いたログイン)などが含まれます。
これらの機能は、手動で実装するのに多くの労力が本来はかかりますが、Deviseではすぐに利用することができます。
インターフェースの提供
Deviseは、ユーザー管理に関する一連のビュー(ユーザー登録、ログイン、パスワードリセットなど)を自動的に生成します。
これにより、ユーザー管理に関する基本的なインターフェースを簡単にセットアップすることができます。
安全性
Deviseは、パスワードのハッシュ化、SQLインジェクション対策、クロスサイトスクリプティング(XSS)対策など、多くのセキュリティ機能を提供します。
これにより、セキュリティの専門知識がない開発者でも、安全な認証システムを簡単に構築することができます。
Deviseのデメリット: 複雑さとパフォーマンスへの影響
複雑さ
Deviseは豊富な機能がある分、初心者にとっては取っ付きにくいかもしれません。
特に、カスタマイズを行おうとすると、Deviseの内部の動きを理解する必要が出てくるため、カスタマイズの難易度は高めです。
また、Deviseが提供する多くのモジュールは、互いに密接に連携して動作するため、一部の挙動を変更するだけでも全体の動作に影響を及ぼす可能性があります。
Devise そのままの機能を使う分には問題ありませんが、何かカスタマイズを加える上では注意が必要です。
パフォーマンスへの影響
Deviseは多くの機能を提供するため、それに伴いアプリケーションへの負荷も大きくなります。
特に大規模なアプリケーションでは、このオーバーヘッドがパフォーマンスに影響を及ぼす可能性があります。
また、不要な機能まで読み込まれることになるため、全体的なアプリケーションの効率性が低下する可能性があります。
ただし、実際にはそこまでの影響はないため、余程パフォーマンスを求められるものではない限りは気にしなくても大丈夫です。
Sorceryのメリット・デメリット
Sorceryのメリット: 軽量性と柔軟性
軽量性
Sorceryは、最小限の機能を提供することに重点を置いています。
これにより、アプリケーションのパフォーマンスにほとんど影響を与えずに、必要な認証機能を追加することができます。
柔軟性とカスタマイズ性
Sorceryは、コードが単純で理解しやすいため、カスタマイズが容易です。
これにより、あなたのアプリケーションの特定の要件に合わせて、認証システムを独自にカスタマイズすることができます。
また、Sorceryはモジュール化されており、必要な機能のみを追加することができます。
これにより、アプリケーションに不要なオーバーヘッドを追加することなく、特定の機能を実装することができます。
Sorceryのデメリット: 機能の少なさとカスタマイズの必要性
機能の少なさ
Sorceryの最大の特徴である軽量性は、一方で機能の少なさを意味します。
Sorceryは基本的な認証機能しか提供しておらず、パスワードリセットやアカウント確認などの一部の高度な機能は自分で実装する必要があります。
これには時間と労力がかかり、高機能なアプリにおいては開発に時間がかかる可能性があります。
カスタマイズの必要性
Sorceryはあくまで「ツール」であり、その使い方は開発者に委ねられています。
このため、Sorceryを使って認証システムを構築するためには、認証に関する一定の知識と理解が必要です。
特に、セキュリティに関する知識がないと、安全でない認証システムを構築してしまう可能性があります。
どちらのライブラリも一長一短で、どちらが「ベスト」かはプロジェクトの要件によります。
どちらを選ぶにせよ、その機能と制限を理解し、適切に使うことが重要です。
DeviseとSorceryどちらを選ぶべき?
それぞれのライブラリは、それぞれ異なる状況で適しています。
大規模なアプリケーションにはDevise
大規模なアプリケーション、特にユーザー管理に関する多くの機能が必要な場合、Deviseが良い選択です。
Deviseはその豊富な機能を活かして、複雑な認証要件を簡単に満たすことができます。
また、Deviseは実績があり、大規模なコミュニティによってサポートされているため、安心して使用できます。
軽量かつ高度にカスタマイズ可能な認証が必要な場合はSorcery
一方、あなたが必要とするのが基本的な認証機能だけであり、それ以上の機能は不要である場合、またはアプリケーションのパフォーマンスを最優先したい場合は、Sorceryが適しています。
また、自分で認証機能を細かく制御したい、という場合にもSorceryが適しています。
Devise も Sorcery も一長一短で、どちらが「ベスト」かはプロジェクトの要件によります。
どちらを選ぶにせよ、その機能と制限を理解し、適切に使うことが重要です。
まとめ
DeviseとSorceryの違いをなんとなくでも理解できたでしょうか。
どちらのライブラリも一長一短で、どちらが「ベスト」かはプロジェクトの要件によります。
どちらを選ぶにせよ、その機能と制限を理解し、適切に使うことが重要です。