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.comsatake7 さん、アカウントは有効になりました。サイトへ移動するには、以下のリンクを開いてください。
- ログインして ToDo を作ってみました。ToDo はできますが、admin でログインして作った ToDo も一緒に見えてしまっています。
もうひとり別のユーザを作ってみて試してみることにしましょう。 - ログイン名だけ別にしてメールアドレスを同じにしたら怒られました。
ログイン名が同じで違うメールアドレスでやってみましたが、こちらも怒られました。ちゃんとチェックが効いてますね。
でも、メールアドレスの重複チェックをやるんだったら、ログイン名はなくてもいいような気がしますが、この辺も好みの問題というかシステムデザインの問題ですね。 - もうひとり別のユーザを作ってみましたが、このユーザでも admin と satake7 の ToDo が見えてますね。確かここ(→ restful_authenticationでユーザー別のTodoリストを管理する - ザリガニが見ていた...。 )で current_user ごとに ToDo を管理する修正が入っていたはずなんですが、デグレードしてしまったんでしょうか。ま、このあたりはユーザ認証部分からいうと本質的なことではないので、テストとしては大きな問題ではないです。
まとめ
すばらしいのひと言です。ZIPを解凍してちょいちょいっと設定を変えるだけでログイン認証&メールでのアクティベートができるなんて最高です。ソースを読ませていただいて使わせていただきます。感謝!