`
fireflyman
  • 浏览: 113363 次
  • 性别: Icon_minigender_1
  • 来自: 火星
社区版块
存档分类
最新评论

在acts_as_authenticated里实现账号激活

阅读更多
之前写过密码找回的,账号激活的也一起写吧...下面的代码是在之前那个的基础上改的...
在acts_as_authenticated里使用密码找回功能
http://fireflyman.iteye.com/blog/801953

首先,请不要再问我为什么不使用
restful_authentication这个插件,一句命令就解决了...
ruby script/generate authenticated user sessions --include-activation

而且有现成的例子...
用Rails 2.3打造简单记账软件(3)
http://dohkoos.name/use-rails-23-to-create-a-simple-accounting-app-3.html

反正就一言难尽..非要说一句的话,我只能说:火星文,你妹啊...

废话就不说了,开始吧:
1.为Users表增加两个字段activation_code和activated_at
ruby script/generate migration AddActivationCodeToUser activation_code:string activated_at:datetime


class AddActivationCodeToUser < 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, :activated_at
    remove_column :users, :activation_code
  end
end


rake db:migrate


2.account_controller改成下面这样-->
class AccountController < ApplicationController
  # Be sure to include AuthenticationSystem in Application Controller instead
  #include AuthenticatedSystem
  # If you want "remember me" functionality, add this before_filter to Application Controller
  before_filter :login_from_cookie

  # say something nice, you goof!  something sweet.
  def index
    redirect_to(:action => 'signup') unless logged_in? || User.count > 0
  end

  def login
    return unless request.post?
    self.current_user = User.authenticate(params[:login], params[:password])
    if logged_in?
      if params[:remember_me] == "1"
        self.current_user.remember_me
        cookies[:auth_token] = { :value => self.current_user.remember_token , :expires => self.current_user.remember_token_expires_at }
      end
      redirect_back_or_default(:controller => '/account', :action => 'index')
      flash[:notice] = "Logged in successfully"
	  else
	   flash[:notice] = "该账号尚未激活"
      note_failed_signin
      @login       = params[:login]
      @remember_me = params[:remember_me]
	  render :action => 'login'
  end
    
      #
  end

  def signup
    @user = User.new(params[:user])
    return unless request.post?
	success = @user && @user.save
    if success && @user.errors.empty?
      redirect_back_or_default('/')
      flash[:notice] = "很感谢你注册!我们已经发了一封激活邮件到你的注册邮箱里,请注意查收."
    else
      flash[:error]  = "We couldn't set up that account, sorry.  Please try again, or contact an admin (link is above)."
      render :action => 'signup'
  end
  #================
    #@user.save!
    #self.current_user = @user
    #redirect_back_or_default(:controller => '/account', :action => 'index')
   # flash[:notice] = "Thanks for signing up!"
  #rescue ActiveRecord::RecordInvalid
    #render :action => 'signup'
  end
  #邮箱激活================================================================
  def activate
   # logout_keeping_session!
    user = User.find_by_activation_code(params[:activation_code]) unless params[:activation_code].blank?
    case
    when (!params[:activation_code].blank?) && user && !user.active?
      user.activate!
      flash[:notice] = "账号已激活! 请登录你的系统."
      redirect_to '/account/login'
    when params[:activation_code].blank?
      flash[:error] = "The activation code was missing.  Please follow the URL from your email."
      redirect_back_or_default('/')
    else 
      flash[:error]  = "We couldn't find a user with that activation code -- check your email? Or maybe you've already activated -- try signing in."
      redirect_back_or_default('/')
    end
end
#=========================================================================
  def logout
    self.current_user.forget_me if logged_in?
    cookies.delete :auth_token
    reset_session
    flash[:notice] = "You have been logged out."
    redirect_back_or_default(:controller => '/account', :action => 'index')
  end
 
   def forgot_password
     return unless request.post?
	 if @user = User.find_by_email(params[:email])
	    @user.forgot_password
	    @user.save
	    flash[:notice] = "An email with instructions for resetting your password has been sent to your email address."
	    redirect_back_or_default(:controller => "/account")
	 else
	 	flash.now[:notice] = "Could not find a user with the given email address."
		#render :forgot_password
	 end
  end
   
   def reset_password
     @page_title = "Reset Password"
	 @user = User.find_by_pw_reset_code(params[:id]) rescue nil
	 unless @user
	   render(:text => "Not found",:status => 404)
	   return
      end
       return unless request.post?
	   if @user.update_attributes(params[:user])
	      @user.reset_password
		 flash[:notice] = "Password successfully reset."
		 redirect_back_or_default(:controller => "/account")
	   end
   end
   protected
  # Track failed login attempts
  def note_failed_signin
    flash[:error] = "Couldn't log you in as '#{params[:login]}'"
    logger.warn "Failed login for '#{params[:login]}' from #{request.remote_ip} at #{Time.now.utc}"
  end
 

end


3.user.rb里也要作相关修改-->
before_create :make_activation_code 
  #邮箱激活==========================================================
  # Activates the user in the database.
  def activate!
    @activated = true
    self.activated_at = Time.now.utc
    self.activation_code = nil
    save(false)
  end

  # Returns true if the user has just been activated.
  def recently_activated?
    @activated
  end

  def active?
    # the existence of an activation code means they have not activated yet
    activation_code.nil?
  end
    
  #邮箱激活==========================================================

   #邮箱激活=====================================================
   def make_activation_code
        self.activation_code = self.class.encrypt(Time.now, 10.times.map { rand.to_s })
    end
	  
  #邮箱激活==========================================================


4.这时候你的user_notifier.rb应该是这样的
class UserNotifier < ActionMailer::Base
	@@session = ActionController::Integration::Session.new
	
	def forgot_password(user)
	  setup_email(user)
	  @subject += "密码重置"
	  @body[:url] = @@session.url_for(:controller => "account",
												    :action => "reset_password",
												    :id => user.pw_reset_code,
												    :only_path => false )
	end
											 
#邮箱激活==============================================================
 def signup_notification(user)
    setup_email(user)
    @subject    += '亲爱的用户,请去邮箱激活你的用户吧.谢谢!'
  
    @body[:url]  = "http://#{SITE_URL}/activate/#{user.activation_code}"
  
  end
  
  def activation(user)
    setup_email(user)
    @subject    += 'Your account has been activated!'
    @body[:url]  = "http://#{SITE_URL}/"
  end

#邮箱激活==============================================================									 
  protected
  def setup_email(user)
	@recipients = "#{user.email}"
	@from = "#{ADMINEMAIL}"
  	@subject     = "[#{SITE_URL}] "
	@sent_on     = Time.now
        @body[:user] = user
	@headers = {}
  end
end


5.user_observer.rb里变成这样了
class UserObserver < ActiveRecord::Observer

  def after_create(user)
    UserNotifier.deliver_signup_notification(user)
  end


  def after_save(user)
   UserNotifier.deliver_activation(user) if user.recently_activated?
   UserNotifier.deliver_forgot_password(user) if user.password_forgotten
  end
  
end


6.在route.rb里加一句
map.activate '/activate/:activation_code', :controller => 'account', :action => 'activate', :activation_code => nil


7.打开enviroment.rb
SITE_URL = "localhost:3000"
ADMINEMAIL = "XXX@163.com"


8.在views/user_notifier增加两个文件,分别为signup_notification.html.erb和activation.html.erb

(1)signup_notification.html.erb
Your account has been created.

  Username: <%= @user.login %>
  Password: <%= @user.password %>

Visit this url to activate your account:

  <%= @url %>


(2)activation.html.erb
<%= @user.login %>, your account has been activated.  You may now start adding your plugins:

<%= @url %>


反正暂时是成功的....
分享到:
评论
1 楼 fireflyman 2011-01-01  
用restful_authentication插件的命令
ruby script/generate authenticated user sessions --include-activation

后,会存在一个小bug,即新用户注册后不激活就登录了系统。

通过注释掉app/controllers/users_controller.rb中create下的
self.current_user = @user


可修复问题.

相关推荐

Global site tag (gtag.js) - Google Analytics