RailsでDeviseによるユーザー登録・ログイン認証・認可の機能追加

Ruby on Rails アプリケーションでユーザー管理を行うために、ユーザー登録、認証の Rails プラグイン Dvise をインストールします。

devise readme

上記公式の devise readme を中心に、実際に作業して必要な部分だけをまとめました。

— 環境 —
Rails 5.0.0.1
Devise 4.2.0

【追記 2016/11/07】
Rails 5.0.0.1 + Devise 4.2.0 という構成の現時点(2016/11/07)での最新バージョン環境で、Rails + Devise によるユーザー認証の実装を試しましたところ、記事公開当初と同様の手順で実装できました。
【追記ここまで】

— 記事初回公開時の環境 —
Rails 4.0.1
Devise 3.2.2

スポンサーリンク

devise の導入手順

Gemfile に devise を追加します。

bundle install を実行。

ジェネレータを実行して、devise をインストール。

続いて devise ジェネレータで、アプリケーションのユーザーのモデルを任意の名前で作成します。

User は任意の名前。例えば管理者用のモデルなら Admin などが可能です。このジェネレーターの実行で、モデルとデフォルト・モジュールのセットアップが行われます。また、config/routes.rb に devise controller へのルーティング設定が行われます。

生成されたマイグレーションファイルを確認してみます。

db/migrate/***_devise_create_users.rb

マイグレート実行。

サーバーが起動していたら、ここでサーバーを再起動します。

devise のヘルパーメソッド

認証を必要とするコントローラーの before_action で以下のように指定。ユーザーのモデル名が User の場合は以下。これで、ログイン中のユーザーのみに許可できるコントローラー・アクションを指定できます。

ユーザーがサインインしているかどうかを検証するメソッド。

現在サインインしているユーザーを取得。

ユーザーのセッション情報にアクセス。

ユーザーのモデル名が Member であれば、以上のヘルパーメソッドはそれぞれ以下となります。

【追記 2014/04/13】
ユーザーが自分自身以外のページへのアクセスや情報編集を制限するには、別途メソッドを実装して before_action で呼ぶなどの必要があります。Ruby on Rails チュートリアル:実例を使って Rails を学ぼう(9章)の correct_user のようなメソッドです。

correct_user を設定したアクションは、@user と current_user(現在ログイン中のユーザー)が一致しない場合は、root_path へとリダイレクトされる。

あるいは、Github: cancan のような認可・権限管理のプラグインを使う。
【追記ここまで】

ログイン後のリダイレクト先の設定

ユーザーがサインインしたり、アカウント情報をアップデートしたりした後、devise はリダイレクト先を探します。ルーティングが “user resource” の場合、リダイレクト先として user_root_path、それがなければデフォルトで root_path が使われます。したがって以下のルーティングを行う。

config/routes.rb を編集して以下を追加。

“homge#index” は任意。

上の’home#index’の例の場合で、root_path 用のコントローラーを生成します。

after_sign_in_path_for と after_sign_out_path_for をリダイレクト用のフックとしてオーバーライドできます。

メーラー用の設定

config/environments/development.rb にメーラー用の設定を行います。

とりあえず動作確認

ビューにフラッシュメッセージを追加。app/views/layouts/application.html.erb を編集します。

以上を、<%= yield %> のすぐ上に追加。

サインアップとログイン用のリンクを追加。app/views/layouts/application.html.erb を編集します。

以上を、body のすぐ下に追加。

devise がサインアップ・サインイン・サインアウトなどに関するコードやルーティングを生成してくれているので、ここで一旦動作確認を行います。

http://localhost:3000/ にアクセスして Sign up をクリックします。http://localhost:3000/users/sign_up をブラウザで開いてユーザーを作成します。

ログインやログアウト、Edit profile などの動作を確認します。ログインしていない時に、http://localhost:3000/users/edit ページの表示ができないことを確認。ログインページ(http://localhost:3000/users/sign_in)にリダイレクトされます。

以上で導入〜動作確認までの作業は終了。ものすごく簡単にサインアップ、認証が実装できて驚きです。

以下はさらに詳細な設定などについて。

モデルの設定

devise は10個のモジュールから構成される。

Database Authenticatable
Omniauthable
Confirmable
Recoverable
Registerable
Rememberable
Trackable
Timeoutable
Validatable
Lockable

モデルで利用するモジュールを指定する。

また、:stretches, :pepper, :encryptor, :confirm_within, :remember_for, :timeout_in, :unlock_in などいくつかのオプションを指定できる。

Strong Parameters

Rails の認証プラグイン Devise での Strong Parameters について | EasyRamble を参照。

ビューの設定

ビューをカスタマイズするには、まず devise のデフォルトのビューをアプリケーションにコピーします。

複数のモデル(User と Admin など)を利用する場合、devise はデフォルトでは全てのモデルで同じビューを利用します。個別にビューを作成する場合は、config/initializers/devise.rb で以下を指定します。

その後、個別のビューを作成するには以下を実行。

コントローラーの設定

コントローラーもカスタマイズが可能です。以下のように、Devise::SessionsController を継承して、例えば Admins::SessionsController を作成します。

app/controller/admins/ ディレクトリにコントローラを作ります。

その後、ルーティングの設定。

コントローラーを上のように変更した場合、”devise/sessions” のビューは使われないので、”devise/sessions” から “admin/sessions” にビューをコピーします。

devise はフラッシュメッセージを利用するので、以下をビューに追加します。

ルーティングの設定

ルーティングの設定は、devise_for メソッドを用いる。:class_name, :path_prefix, I18n 用のオプションなどを利用できます。

config/routes.rb で設定。

もっと詳細にルーティング設定をする場合は、devise_scope メソッドのブロックで指定。

I18n の設定

ロケールファイルで指定する。

モデルが2つある場合に、単数形のモデル名で分けて、個別にメッセージを指定できます。

devise mailer 用の設定。

以下、URLから日本語および各言語のファイルを取得できます。ファイルはdevise.ja.yml。

https://github.com/plataformatec/devise/wiki/I18n

テストヘルパー(RSpec)

RSpec を使う場合、spec/spec_helper.rb か spec/support/devise.rb に以下を記述。

以上の設定で、テストで sign_in, sign_out のメソッドが使えます。

注意点が2つ。

1. これらのヘルパーは、Capybara か Webrat を用いた integration tests では動作しないだろう。fuctional tests だけで動作する。代わりに、フォームを埋めるか明示的にセッションにユーザーをセットします。

2. devise 内部のコントローラーや devise から継承したコントローラーをテストする場合、devise に、リクエストの前にどのマッピングを使うかを教える必要がある。

Omniauth の設定

Rails4 で Devise と OmniAuth で、Twitter/Facebook のOAuth認証と通常フォームでの認証を併用して実装 | EasyRamble を参照。

複数のモデルの設定

User モデルに加えて、Admin モデルを追加したい場合、以下の手順で追加できます。

代わりに、単純に devise generator を使っても良いです。

注意点としては、それらのモデルは違うルーティングを持ち、サインイン・サインアウト用などのコントローラーも共有できない。コントローラーのアクションを共有して、異なる役割を持たせたい場合、role を使うことを推奨します。role カラムを追加するか、CanCan を使うと可能です。

admin という管理者用カラムを追加する場合。

以上。Strong Parameters と Omniatuh についてはまた別途書く予定です。

スポンサーリンク
パーフェクト Ruby on Rails は、最近読んだ Rails 本の中では一番役に立った本です。Chef や Capistrano など Rails と共によく使用される技術にも触れてあります。Ruby on Rails 4 アプリケーションプログラミングは、入門的な内容で Rails の機能全体を網羅されています。
スポンサーリンク
 
Twitterを使っていますのでフォローお願いたします!ブログの更新情報もつぶやいてます^^
(英語学習用)

Leave Your Message!