act_as_authenticated
以下を参考に導入してみた.
Installation
プラグインのインストール
% ruby script/plugin discover % ruby script/plugin install acts_as_authenticated
UserモデルとAccountコントローラの作成
% ruby script/generate authenticated user account % vim config/database.yml % rake db:migrate
authenticated_mailerのセットアップ
対応するモデル(User)を指定.
% ruby script/generate authenticated_mailer user
メールサーバの指定などを追加
vim config/environments/development.rb
ActionMailer::Base.smtp_settings = { :address => 'smtp server', :port => 25, :user_name => 'username', :password => 'password', :authentication => :plain }
app/models/user_notifier.rb -> setup_emailメソッド内のインスタンス変数を変更
@from @subject @body[:user]
Userモデルの変更
Schemaの変更
% ruby script/generate migration AddActivationToUser % vim db/migrate/002_add_activation_to_user.rb
class AddActivationToUser < ActiveRecord::Migration def self.up add_column :users, :activation_code, :string, :limit => 40 add_column :users, :activated_at, :datetime end def self.down remove_column :users, :activation_code remove_column :users, :activated_at end end
% rake db:migrate
Userモデルの変更
下記メソッドを追加
class User < ActiveRecord::Base before_create :make_activation_code # loginと非暗号のパスワードから認証し、userかnilを返す def self.authenticate(login, password) # activated_atがnullではない u = find(:first, :conditions => ['login = ? and activated_at IS NOT NULL', login]) u && u.authenticated?(password) ? u : nil end # activateしてインスタンス変数を設定 def activate @activated = true update_attributes(:activated_at => Time.now.utc, :activation_code => nil) end # インスタンス変数を返す def recently_activated? @activated end protected # 有効化コードを生成する def make_activation_code self.activation_code = Digest::SHA1.hexdigest( Time.now.to_s.split(//).sort_by {rand}.join ) end end