パスワードのリマインダ機能を実装するのに、forgot_passwordを利用してみた。認証エンジンには、AuthLogicを使用している。
まず、プラグインをインストール。(事前にgitをインストールしておく必要がある。)
ruby script/plugin install git://github.com/greenisus/forgot_password.git
続いて、forgot_passwordジェネレータを利用して必要なファイルを生成する。
ruby script/generate forgot_password forgot_password user
第一引数のforgot_passwordがパスワードを管理するモデルで、第二引数のuserがユーザ情報を管理するモデルを指定する。
このジェネレータを実行することで下記ファイルが生成される。
- app/models/forgot_password.rb
- app/models/forgot_password_mailer.rb
- app/controllers/forgot_passwords_controller.rb
- app/helpers/forgot_passwords_helper.rb
- app/views/forgot_passwords/new.html.erb
- app/views/forgot_passwords/reset.html.erb
- db/migrate/20090714044728_create_forgot_passwords.rb
- app/views/forgot_password_mailer/forgot_password.html.erb
- app/views/forgot_password_mailer/reset_password.html.erb
このうち、forgot_passwords_controller.rbのupdate_after_forgettingメソッド内の下記コードを削除する。
PasswordMailer.deliver_reset_password(@user)
あと、routes.rbにforgot_passwordにアクセスするための下記リソース定義が追記される。
map.forgot_password '/forgot_password', :controller => 'forgot_passwords', :action => 'new' map.change_password '/change_password/:reset_code', :controller => 'forgot_passwords', :action => 'reset' map.resources :forgot_passwords
新たにforgot_passwordsテーブルをDBに追加するため、rakeコマンドを実行する。
rake db:migrate
続いてdevelopment.rb等にActionMailerが使用するSMTPの設定情報を定義する。
config.action_mailer.raise_delivery_errors = true config.action_mailer.delivery_method = :smtp config.action_mailer.smtp_settings = { :address => 'SMTPのアドレスを定義', :port => SMTPポート, :domain => "hoge.jp" }
最後に、ログインページあたりに、リンクを生成して遷移させるようにすれば一通り動作する。
<%= link_to 'パスワードを忘れた場合は?', forgot_password_path %>
結構、お手軽かつAuthLogicのUserモデルと疎な結合で実現できるので便利だ♪