Recuperar contraseñas con restful_authentication
- Posted by Amaia on April 07, 2008 at 10:41 PM
- Comments: 1 (view/add your own)
- tags: rails2, restfulauthentication, tutoriales
Continuación del post anterior para recuperar las contraseñas olvidadas.
Continuación del post anterior para recuperar las contraseñas olvidadas.
Pasos para crear una aplicación rails con autenticación de usuarios.
Crear la aplicación rails:
$ rails myapp
$ cd myapp
Instalar el plugin restful_authentication:
$ script/plugin install http://svn.techno-weenie.net/projects/plugins/restful_authentication/
Generar el sistema de autenticación:
$ script/generate authenticated user session
$ rake db:migrate
En config/routes.rb añadir lo siguiente antes de las rutas por defecto (las dos últimas)
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'
En app/controllers/application_controller.rb poner la línea siguiente, que viene en los controladores user_controller.rb y session_controller.rb que ha creado el plugin.
include AuthenticatedSystem
Poniendolo en application_controller.rb hacemos que la autenticación esté disponible para todos los controladores.
Ahora en los controladores para los que queramos restringir el acceso a usuarios autenticados tendremos que poner un filtro:
before_filter :login_required
A este filtro le podemos poner parámetros para indicarle que sólo se aplique a algunas acciones o que se aplique a todas excepto a algunas, por ejemplo:
before_filter :login_required, :only => [:create, :destroy]
before_filter :login_required, :except => [:index, :show]
En mi caso últimamente es habitual que necesite controlar el acceso a toda la aplicación salvo a unas pocas acciones por lo que pongo el before_filter en application_controller.rb y luego pongo un skip_before_filter donde sea necesario, que en este caso es en users_controller.rb y session_controller.rb para permitir crear nuevos usuarios y hacer login, que en realidad es crear una nueva session. Por tanto en estos dos controladores pongo:
skip_before_filter :login_required, :only => [:new, :create]
Si además hay una portada de la aplicación pública también habrá que aplicarle esto.
Para hacer que el registro sea con activación de usuarios por email, ver este otro post.
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.