VistaでRestfulAuthenticationを実装するには
2012/08/15
基本的にはここの手順を追うことにする。
カスタマイズはうまく行った後でということで。
-------------------------
手順
1:なにはともあれRestfulAuthenticationのインストール
$ ruby script/plugin install http://svn.techno-weenie.net/projects/plugins/restful_authentication/
インストールが完了するとREADMEが表示される
-------------
Restful Authentication Generator
====
This is a basic restful authentication generator for rails, taken
from acts as authenticated. Currently it requires Rails 1.2.6 or above.
To use:
./script/generate authenticated user sessions \
--include-activation \
--stateful
The first parameter specifies the model that gets created in signup
(typically a user or account model). A model with migration is
created, as well as a basic controller with the create method.
The second parameter specifies the sessions controller name. This is
the controller that handles the actual login/logout function on the
site.
The third parameter (--include-activation) generates the code for a
ActionMailer and its respective Activation Code through email.
The fourth (--stateful) builds in support for acts_as_state_machine
and generates activation code. This was taken from:
http://www.vaporbase.com/postings/stateful_authentication
You can pass --skip-migration to skip the user migration.
If you're using acts_as_state_machine, define your users resource like this:
map.resources :users, :member => { :suspend => :put,
:unsuspend => :put,
:purge => :delete }
Also, add an observer to config/environment.rb if you chose the
--include-activation option
config.active_record.observers = :user_observer # or whatever you
# named your model
Security Alert
====
I introduced a change to the model controller that's been tripping
folks up on Rails 2.0. The change was added as a suggestion to help
combat session fixation attacks. However, this resets the Form
Authentication token used by Request Forgery Protection. I've left
it out now, since Rails 1.2.6 and Rails 2.0 will both stop session
fixation attacks anyway.
-------------
2:同様にscript/generate authenticated
$ ruby script/generate authenticated user sessions --include-activation
こんな感じでgenerateしちゃいます。
3:rake db:migrate
$ rake db:migrate
を実行。developmentにテーブルが作られます。
C:\rails\riken2>rake db:migrate
(in C:/rails/riken2)
== CreateUsers: migrating ====================================================
-- create_table("users", {:force=>true})
-> 0.0070s
== CreateUsers: migrated (0.0070s) ===========================================
4:app/controllers/application.rbに追記
コメントに従って、コントローラーのapplication.rbへコピーした。(これで、lib/authenticated_system.rbのメソッド定義は、すべてのコントローラーで利用できるようになる。)
----------
class ApplicationController < ActionController::Base
include AuthenticatedSystem
helper :all # include all helpers, all the time
----------
5:ここまででとりあえず動作確認をしてみる。
動作(Event) | URL | HTTPメソッド(method) | ルートパス名(Named route path) | 処理されるコントローラー, アクション(controller, action) |
---|---|---|---|---|
ログインのページ(Show login page) | http://localhost:3000/session/new | GET | new_session_path | sessions_controller, new |
ログインの実行(Login) | http://localhost:3000/session | POST | session_path | sessions_controller, create |
ログアウトの実行(Logout) | http://localhost:3000/session | DELETE | session_path | sessions_controller, destroy |
ユーザー登録のページ(Show sign up page) | http://localhost:3000/users/new | GET | new_user_path | users_controller, new |
ユーザー登録の実行(Sign up) | http://localhost:3000/users | POST | user_path(User.new) | users_controller, create |
ひとまずここまででユーザーを作ることはできたようだ。
二度同じユーザー名で登録するとエラーが出た。
うし、次に行こう!
6:プロジェクトのルートページが必要
とのことなので適宜修正。
次にメール認証の設定をしよう。ここが一番の肝。
メール認証の設定
config/environment.rbの設定
- Userモデルを監視するuser_observerを有効にする。
- I validated user_observer watching the User model.
# ---------- config/environment.rb ----------
...(中略)...
Rails::Initializer.run do |config|
...(中略)...
config/routes.rbの設定
メール認証(アクティベーション)用のルートを追加した。
# ---------- config/routes.rb ----------
ActionController::Routing::Routes.draw do |map|
map.resources :users
map.resource :session
map.resources :todos
map.activate '/activate/:activation_code', :controller = > 'users', :action => 'activate'
...(中略)...
# You can have the root of your site routed with map.root -- just remember to delete public/index.html.
map.root :controller => "welcome"
# See how all your routes lay out with "rake routes"
# Install the default routes as the lowest priority.
map.connect ':controller/:action/:id'
map.connect ':controller/:action/:id.:format'
end
config.active_record.observers = :user_observer
end
この辺から先は、先のブログの通りでOK。
SMTPの設定の場所で、ローカルから開発やってるとプロバイダのフィルタに引っ掛かってうまくいかないかもしれませんが
/log/development.log
を見れば、ちゃんとメールが送れているか否かはわかります。
アクティベーションURLとかも書いてあるから直接URL確かめてみれば良い。
アクティベーション後のメールが送信されている雰囲気がログに残っていればOK。
さーって、ちゃんと動くじゃないか!!!
あとは、既存のシステムにいかにマージして動かすかだな。
あとちょっとな予感がする。