その他
    ホーム技術発信DoRubyRuby On Rails ログインのプラグイン restful_authentication

    Ruby On Rails ログインのプラグイン restful_authentication

    この記事はアピリッツの技術ブログ「DoRuby」から移行した記事です。情報が古い可能性がありますのでご注意ください。

    こんにちわ〜。

    2日続けてのプラグイン紹介で、今回はログインのプラグインの紹介です。
    前はacts_as_authenticationというプラグインがよく使われてたらいいんですが、
    サポートが打ち切られたらしくrails2.0系からは、restful_authenticationを代わりに使ってほしいそうです。

    とゆうわけで解説の始まり始まり〜。。。。

    restful_authenticationのインストール

    $ruby script/plugin http://svn.techno-weenie.net/projects/plugins/restful_authentication –force

    acts_as_state_machineのインストール

    $./script/plugin install http://elitists.textdriven.com/svn/plugins
    このプラグインは、会員の状態管理などを行ってくれる。

    コントローラーなど作成

    $ ./script/generate authenticated user sessions –include-activation –stateful

    設定

    config/rootes.rb
    # 次の4行を書く。1行目はactivate(本会員)にするために必要、

    map.activate ‘/activate/:activation_code’, :controller => ‘users’, :action => ‘activate’, :activation_code => nil
    map.signup ‘/signup’, :controller => ‘users’, :action => ‘new’
    map.login ‘/login’, :controller => ‘sessions’, :action => ‘new’
    map.logout ‘/logout’, :controller => ‘sessions’, :action => ‘destroy’
    controllers/sessions_controller.rb

    # Be sure to include AuthenticationSystem in Application Controller instead
    include AuthenticatedSystem

    この2行を削除してcontrollers/application_controller.rbにコピーする。

    localhost:3000/signupなどで仮会員を作成その後rootへ戻るのでどこかで本会員へするためuser/activateへ飛ばさなくてはならない、
    飛ばすときに仮登録したuserのactivation_codeを持たせてあげないと反応しない、これではじめてloginが可能となる。

    acts_as_state_machine

    作成されたusers_controllerの中に今の説明中に説明していないsuspend,unsuspend,destroy,purgeメソッドが存在する。
    これは、acts_as_state_machineの機能で、model/user.rbの20行以降で定義されている。

    acts_as_state_machine :initial => :pending
    state :passive
    state :pending, :enter => :make_activation_code
    state :active, :enter => :do_activate
    state :suspended
    state :deleted, :enter => :do_delete

    これは、初期状態のときstate :pendingへ移行して:enter => :make_activation_codeから

    def make_activation_code
    self.deleted_at = nil
    self.activation_code = Digest::SHA1.hexdigest( Time.now.to_s.split(//).sort_by {rand}.join )
    end

    こいつを呼び出している、これは、仮登録状態のためのキーを発行している このキーを受け取ってactivateへ行くと本登録をしてくれる。それと同時に、仮登録のキーを

    def do_activate
    @activated = true
    self.activated_at = Time.now.utc
    self.deleted_at = self.activation_code = nil
    end

    これで削除している。
    suspend,unsuspendは、状態変化ぐらいかな?
    あ、状態変化は、userテーブルのsateカラムが変化してます。
    destroyは、状態変化とdeletd_atカラムに現在時間を入れています。
    purgeは、物理削除です。ちなみにpurgeは追放とかいう意味です。

    これがrestful_authenticationの一通りの流れです。仮登録のときメール飛ばして返ってきたのを本登録にするとかもいろいろできるらしいです。(今回は、そこまでやってません)

    というわけで終しまいです。