RESTful authentication con activación de usuarios

Esta mañana he estado pegándome con el plugin restful_authentication para que activase correctamente los usuarios. Por "suerte" Jaime estaba en las mismas y después de hablar un ratillo por jabber hemos conseguido que funcionase correctamente. Había que hacer un par de cosas que no están bien explicadas en la documentación del plugin y que hemos encontrado en los comentarios de la página del plugin en el directorio de plugins de agilewebdevelopment.com.

Dejo aquí apuntados los pasos para futura referencia.

Primero instalar el plugin:

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

Crear los usuarios y las sesiones con activación de usuarios con el generador que trae el plugin:

$ script/generate authenticated user session —include-activation
$ rake db:migrate

Añadir las rutas necesarias en config/routes.rb, según el README del plugin:

map.resources :users
map.resource  :session, :controller => 'session'

map.signup '/signup', :controller => 'users', :action => 'new'
map.login  '/login', :controller => 'session', :action => 'new'
map.logout '/logout', :controller => 'session', :action => 'destroy'

Y una que no viene en la doc pero que es necesaria para que funcionen los links de activación enviados por email.

map.activate '/activate/:activation_code', :controller => 'users', :action => 'activate'

Configurar ActionMailer para que envíe correo. Poner las urls correctas para nuestra aplicación en app/models/user_mailer.rb. En lugar de ponerlas a pelo, se puede definir HOST en environment.rb con:

HOST = "localhost:3000"

y luego en app/models/user_mailer.rb poner:

@body[:url]  = "#{$HOST}/activate/#{user.activation_code}"

Por último, no queremos que el usuario quede logueado al registrarse, si no ¿qué sentido tiene la activación? Para esto hay que comentar la línea que dice self.current_user = @user después de @user.save! en el método create de users_controller.rb:


  def create
    cookies.delete :auth_token
    @user = User.new(params[:user])

    @user.save!
    # ** No logueamos al usuario hasta que se haya validado **
    # self.current_user = @user 
    redirect_back_or_default('/')
    flash[:notice] = "Thanks for signing up! Follow the instructions mailed to you to activate your account."
  rescue ActiveRecord::RecordInvalid
    render :action => 'new'
  end

Una vez hecho todo esto no olvidar reiniciar mongrel y poner en controllers/application.rb

include AuthenticatedSystem

y en los controladores a los que se quiera restringir el acceso

before_filter :login_required

En Railscasts hay un episodio muy chulo sobre este plugin, y aunque no cubre la parte de activación de usuarios, está bien para ver como va la cosa.


Exception Notifier Plugin

Este plugin envía notificaciones por correo cada vez que en la aplicación salta una excepción (sólo en producción).

Para instalarlo:

script/plugin install http://dev.rubyonrails.org/svn/rails/plugins/exception_notification/

Luego siguiendo las instrucciones del README en apps/controllers/aaplication.rb hay que incluir:

include ExceptionNotifiable

y en environment.rb hay que poner:

ExceptionNotifier.exception_recipients = %w(email1@dominio.com email2@dominio.com)

# defaults to exception.notifier@default.com
ExceptionNotifier.sender_address = %("Exception Notifier" <notifier@dominio.com>)

# defaults to "[ERROR] "
ExceptionNotifier.email_prefix = "[App Exception] "

Y configurar ActionMailer para que pueda enviar los correos de notificación. Un ejemplo con SMTP con autenticación:

ActionMailer::Base.smtp_settings = {
  :address => 'dominio.com',
  :domain  => 'dominio.com',
  :port     => 25,
  :authentication => :plain,
  :username => 'notifier',
  :password => 'password'
}

Si preferimos usar sendmail habría que poner:

ActionMailer::Base.delivery_method = :sendmail

Más info sobre la configuración de ActionMailer aquí.


Plugins habituales

Annotate Models

http://agilewebdevelopment.com/plugins/annotate_models

$ script/plugin install http://repo.pragprog.com/svn/Public/plugins/annotate_models

Manage Fixtures

http://agilewebdevelopment.com/plugins/manage_fixtures

$ script/plugin install http://svn.toolbocks.com/plugins/manage_fixtures/

Localization Simplified

http://agilewebdevelopment.com/plugins/localization_simplified

$ script/plugin install svn://rubyforge.org/var/svn/l10n-simplified

Acts as Taggable on Steroids

http://agilewebdevelopment.com/plugins/actsas_taggableon_steroids

$ script/plugin install http://svn.viney.net.nz/things/rails/plugins/acts_as_taggable_on_steroids