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
 
comments powered by Disqus