第12回: ユーザー認証(1)
2010/05/18
前回は、Rails 3.0 で導入された新しい Gem パッケージ管理ツール Bundler を紹介しました。
今回と次回はユーザー認証の仕組みをアプリケーションに追加します。
Devise
Devise を利用すると、メールアドレスとパスワードによるユーザー認証機構を Rails アプリケーションに簡単に組み込むことができます。
現時点(2010/08/30)での最新版は 1.1.2 です。Gemfile
を次のように修正してください。
source 'http://rubygems.org' gem 'rails', '3.0.0' gem 'sqlite3-ruby', :require => 'sqlite3' gem 'will_paginate', '3.0.pre' gem 'devise', '1.1.2'
続いて、Bundler でインストールします。
% bundle install
ただし、Windows ユーザーの方は、Devise が依存する bcrypt-ruby パッケージのインストールで失敗するかもしれません。その場合、おそらく次のようなエラーメッセージが出ていることでしょう。
'make' は、内部コマンドまたは外部コマンド、操作可能なプログラムまたはバッチファイルとして認識されていません。
この場合は、DevKit をインストールしてみてください。手順は、以下の通り:
- http://rubyinstaller.org/downloads/ を開き、「DEVELOPMENT KIT」セクションにある最新の .exe ファイル(自己展開型圧縮データ)をダウンロード。
- ダウンロードしたファイルをダブルクリックし、展開(解凍)先のフォルダとして「C:\DevKit」と指定する。
- コマンドプロンプトを開き、以下のコマンドを順に実行する。
cd \DevKit ruby dk.rb init ruby dk.rb install
DevKit のインストールが完了したら、Nchack アプリケーションのフォルダに戻って、再び bundle install を実行してください。
コマンド gem list devise を入力して、次のように出力されればインストール成功です。
*** LOCAL GEMS *** devise (1.1.2)
[更新] DevKit を利用して Windows 環境に Devise をインストールする手順の記述を追加しました。(2010-10-11)
Windows 環境で使用できる Ruby バイナリには、rubyinstaller.org で配布しているものの他に、ActiveScriptRuby もあります。しかし、ActiveScriptRuby は DevKit に対応しておりませんのでご注意ください。読者から教えていただきました。(2010-11-12)
Devise の準備
Devise を使うには、いくつか準備作業が必要です。
まず、Devise をアプリケーションに組み込みます。
% rails generate devise:install
次に、config/environments/development.rb
を開いて、次のように修正します。
Nchak::Application.configure do (省略) config.action_mailer.default_url_options = { :host => 'localhost:3000' } end
本番環境にアプリケーションをセットアップする際には、実際に使用するドメイン名を config/environments/production.rb
に記述する必要があります。
次に、app/views/layouts/application.html.erb
を修正します。ログインに成功または失敗した時などに Devise が設定するメッセージを画面に表示するためです。
(省略) <div id="contents"> <p class="notice"><%= notice %></p> <p class="alert"><%= alert %></p> <%= yield %> </div> (省略)
トップページの作成
我々の Nchak にはまだトップページがありません。この辺りで作っておきましょう。
まず、public/index.html
を削除します。
次に、config/routes.rb
を修正します。
Nchak::Application.routes.draw do root :to => 'welcome#index' resources :tasks, :only => [ :index, :create ] do put :finish, :on => :member put :unfinish, :on => :member get :done, :on => :collection end end
root :to => 'welcome#index'
という記述は、ルートパス(/)にアクセスがあったら、welcome コントローラの index アクションが対応する、ことを宣言しています。
welcome コントローラの index アクションを生成します。
% rails generate controller welcome index
ブラウザでトップページを開くと、次のように表示されるはずです。
ビューの生成
Devise が使用する標準のビュー(HTMLテンプレート)を生成します。
% rails generate devise:views
このコマンドを実行すると、app/views/devise
ディレクトリに数多くの ERB ファイルが生成されます。Devise はこれらのテンプレートを使って、ユーザー登録フォーム、ログインフォーム等を表示したり、ユーザー登録の確認メールの本文を作ったりします。我々がこれらを書き換えれば、自由にアプリケーションをカスタマイズできます。
User モデルの作成
User モデルを作ります。
% rails generate devise user
このコマンドによりモデルクラスファイルとマイグレーションスクリプトが生成されます。
モデルクラスファイル app/models/user.rb
の中身は、こうなります。
class User < ActiveRecord::Base # Include default devise modules. Others available are: # :token_authenticatable, :lockable and :timeoutable devise :database_authenticatable, :registerable, :confirmable, :recoverable, :rememberable, :trackable, :validatable # Setup accessible (or protected) attributes for your model attr_accessible :email, :password, :password_confirmation end
マイグレーションスクリプト db/migrate/20100522000000_devise_create_users.rb
は、こうです。
class DeviseCreateUsers < ActiveRecord::Migration def self.up create_table(:users) do |t| t.database_authenticatable :null => false t.confirmable t.recoverable t.rememberable t.trackable # t.lockable :lock_strategy => :failed_attempts, :unlock_strategy => :both # t.token_authenticatable t.timestamps end add_index :users, :email, :unique => true add_index :users, :confirmation_token, :unique => true add_index :users, :reset_password_token, :unique => true # add_index :users, :unlock_token, :unique => true end def self.down drop_table :users end end
マイグレーションを実行します。
% rake db:migrate
第13回: ユーザー認証(2)へ続きます。
[更新] Rails 3.0.0 正式リリースと Devise 1.1.2 リリースに合わせて、Gemfile のコードを変更しました。(2010/08/30)
[更新] 読者からのご指摘により、rails generate devise_installdevise:install と修正しました。同様に rails generate devise_viewsdevise:views と修正しました。(2010/09/07)
[更新] Devise 1.1.2 リリースに合わせて、User モデルとマイグレーションスクリプトのコードを変更しました。(2010/10/11)