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。

さーって、ちゃんと動くじゃないか!!!
あとは、既存のシステムにいかにマージして動かすかだな。
あとちょっとな予感がする。

おすすめ記事一覧

 - Tips