おおいしつかさ


旅行とバイクとドライブと料理と宇宙が好き。
Ubie Discoveryのプログラマ。
Share:  このエントリーをはてなブックマークに追加

Acts as Authenticatedを使ってみた

  Acts as Authenticatedを使ってみました。Railsに認証機能を備えることができるpluginです。今まではLoginEngineとかLoginGeneraterとかいろいろあったと思うけど、Acts as Authenticatedはシンプルで使いやすくて簡単。

1.インストール

script/plugin install http://svn.techno-weenie.net/projects/plugins/acts_as_authenticated  

2.コントローラ、ビュー、モデル、テーブルの作成

script/generate authenticated user account  
rake db:migrate  

基本的にはこれだけです。めちゃ簡単。/account/signupにアクセスすれば、サインアップ画面が表示されると思います。文章は適宜日本語に変えましょう。
さらに、よくあるようなメールを使ったサインアップもできます。

3.メール関係のモデル等を作成

script/generate authenticated_mailer user  

4.observerの設定。
 Acts as Authenticatedではobserverでuserテーブルを監視していて、createのときにそれをフックしてメールを送信するような仕組みになっているようです。
 ただしObserverメソッドはRails2.0でなくなってしまうようなので、かわりにconfig/environment.rbのRails::Initializer.runブロック内に以下の文を追加しましょう。

Rails::Initializer.run do |config|  
  config.active_record.observers = :user_observer  
end  

5.userモデルへのカラム追加
 migrationを使用して、usersテーブルに以下のふたつのカラムを追加します。

add_column :users, :activation_code, :string, :limit => 40  
add_column :users, :activated_at, :datetime  

rake db:migrateを忘れずに。

6.userモデルの修正
 Userモデルに以下の修正を実施します。

 class User < ActiveRecord::Base  
    before_create :make_activation_code  
 
    # Authenticates a user by their login name and unencrypted password.  Returns the user or nil.  
    def self.authenticate(login, password)  
      # hide records with a nil activated_at  
      u = find :first, :conditions => ['login = ? and activated_at IS NOT NULL', login]  
      u && u.authenticated?(password) ? u : nil  
    end  
 
    # Activates the user in the database.  
    def activate  
      @activated = true  
      update_attributes(:activated_at => Time.now, :activation_code => nil)  
    end  
 
    # Returns true if the user has just been activated.  
    def recently_activated?  
      @activated  
    end  
 
    protected  
    # If you're going to use activation, uncomment this too  
    def make_activation_code  
      self.activation_code = Digest::SHA1.hexdigest( Time.now.to_s.split(//).sort_by {rand}.join )  
    end  
  end  

7.コントローラの修正
 account_controllerの修正です。

def activate  
  @user = User.find_by_activation_code(params[:id])  
  if @user and @user.activate  
    self.current_user = @user  
    redirect_back_or_default(:controller => '/account', :action => 'index')  
    flash[:notice] = "Your account has been activated." 
  end  
end  

 これで完了。ためしてみてください。とても簡単だなあ。