restful_authentication+stateful のお勉強

まずは、『ザリガニが見ていた...。』さんの作成された『restful_authentication + stateful(aasm) + email変更の認証手続き + emailによるログイン機能』を自分の環境で動かしてみてお勉強してみます。

ダウンロード

こちら(→ [http://github.com/zarigani/todo_stateful_template/tree/master:title=
zarigani / todo_stateful_template])からソースをダウンロードします。
ダウンロードボタンを押すと、ZIP にするか TAR にするか聞いてきますから、お好きな方で。今回はお勉強でWindows環境で動かしてみるつもりなので、ZIP で落としました。/home/www/todo に解凍しておきます。

DB環境の整備

そのままだと sqlite 3 を使うようになっているので、MySQL に変えておきます(うちの環境に sqlite 3 をインストールしてないため)。

$ cd /home/www/todo
$ e config/database.yml

development:
  adapter: mysql
  encoding: utf8
  database: todo_development
  username: root
  password: ******
  host:     localhost
  timeout:  180000

test と production も同様に変更して、MySQL でデータベースを Create しておきます(sqlite ならこういう面倒なことはやらなくていいのにね)。

$ mysql -u root -p******

mysql> create database todo_development;
mysql> create database todo_test;
mysql> create database todo_production;
Query OK, 1 row affected (0.00 sec)

aasmのインストール

あとで、db:migrate するときに、aasm がないと言われるので、aasm を gem install しておきます。

$ gem sources -a http://gems.github.com
http://gems.github.com added to sources
$ gem install rubyist-aasm
Successfully installed rubyist-aasm-2.0.2
1 gem installed
Installing ri documentation for rubyist-aasm-2.0.2...
Installing RDoc documentation for rubyist-aasm-2.0.2...

db:migrate

$ rake db:migrate
 (in C:/home/www/todo)
 == 20080827004306 CreateTodos: migrating ==============
 -- create_table(:todos)
 == 20080827004306 CreateTodos: migrated (0.1200s) =====
 == 20080827004931 CreateUsers: migrating ==============
 -- create_table("users", {:force=>true})
 -- add_index(:users, :login, {:unique=>true})
 == 20080827004931 CreateUsers: migrated (0.3410s) =====
 == 20080827011646 CreateRoles: migrating ==============
 -- create_table(:roles)
 == 20080827011646 CreateRoles: migrated (0.0900s) =====
 == 20080827011710 CreatePermissions: migrating ========
 -- create_table(:permissions)
 == 20080827011710 CreatePermissions: migrated (5.7980s)

一応、正常に終わったようです。

config/initializers/mail.rb の設定

$ e config/initializers/mail.rb
USERNAME = 'satake7' #@gmail.comを除くユーザー名を設定
PASSWORD = '*******' #パスワードを設定

ここに gmail のメールアドレスとパスワードを書いておきます。
もう1箇所、サーバのURLを設定するところがありますが、テストなのでデフォルトのままにしておきました。

$ e app/models/user_mailer.rb
class UserMailer < ActionMailer::Base
  YOURSITE = 'localhost:3000' #サーバーのURLが'http://localhost:3000/'の場合

動かしてみる

サーバを起動してみます。起動は問題ないようです。

$ ruby script/server
 => Booting Mongrel (use 'script/server webrick' to force WEBrick)
 => Rails 2.1.0 application starting on http://0.0.0.0:3000
 => Call with -d to detach
 => Ctrl-C to shutdown server
 ** Starting Mongrel listening at 0.0.0.0:3000
 ** Starting Rails with development environment...
 ** Rails loaded.
 ** Loading any Rails specific GemPlugins
 ** Signals ready.  INT => stop (no restart).
 ** Mongrel 1.1.5 available at 0.0.0.0:3000
 ** Use CTRL-C to stop.
  • http://localhost:3000/』にアクセスしてみました。
    http://localhost:3000/session/new』へリダイレクトされて、ログイン用の画面が出てきました。

  • ユーザID=admin / パスワード=admin でログインすると、ちゃんと admin の ToDo 画面に切り替わりました。

  • メニューを表示させていったんログアウトしてみます。ログアウトはメニューの中じゃなくて外にあったほうがわかりやすい気がします。このあたりはどうとでもなることですが。

  • ユーザ登録してみます。
  • テストだからと思ってパスワードを適当なのにしたら怒られました。

  • ちゃんと入力したら『アクティベートしてくださいね』というメッセージがでました。メールもちゃんと飛んできています。有効期限も書いてあるとなおベターかもしれませんね。

Subject: [localhost:3000] アカウントを有効にする手続きをお願いします。
Date: Fri, 5 Sep 2008 13:47:54 +0900
From: satake777@gmail.com
To: mam@satake777.com

ユーザー登録を受け付けました。

ユーザー名: satake7

アカウントを有効にするために、このURLを開いてください。

http://localhost:3000/activate/31cfa3ce5d77b4385c4fe4a001fd2dba7bc49c3a

  • このURLを開くとちゃんと認証が済んで『http://localhost:3000/login』へリダイレクトされました。アクティベートOKのメールも来ています。

Subject: [localhost:3000] アカウントは有効になりました。
Date: Fri, 5 Sep 2008 14:41:23 +0900
From: satake777@gmail.com
To: mam@satake777.com

satake7 さん、アカウントは有効になりました。サイトへ移動するには、以下のリンクを開いてください。

http://localhost:3000/

  • ログインして ToDo を作ってみました。ToDo はできますが、admin でログインして作った ToDo も一緒に見えてしまっています。
    もうひとり別のユーザを作ってみて試してみることにしましょう。

  • ログイン名だけ別にしてメールアドレスを同じにしたら怒られました。
    ログイン名が同じで違うメールアドレスでやってみましたが、こちらも怒られました。ちゃんとチェックが効いてますね。
    でも、メールアドレスの重複チェックをやるんだったら、ログイン名はなくてもいいような気がしますが、この辺も好みの問題というかシステムデザインの問題ですね。

  • もうひとり別のユーザを作ってみましたが、このユーザでも admin と satake7 の ToDo が見えてますね。確かここ(→ restful_authenticationでユーザー別のTodoリストを管理する - ザリガニが見ていた...。 )で current_user ごとに ToDo を管理する修正が入っていたはずなんですが、デグレードしてしまったんでしょうか。ま、このあたりはユーザ認証部分からいうと本質的なことではないので、テストとしては大きな問題ではないです。

まとめ

すばらしいのひと言です。ZIPを解凍してちょいちょいっと設定を変えるだけでログイン認証&メールでのアクティベートができるなんて最高です。ソースを読ませていただいて使わせていただきます。感謝!