RoR: authlogic

octubre 9 2009Se el primero en comentar

Guardado en : Programaci贸n, Software Libre

Una de las opciones que existen para controlar el acceso de tu aplicaci贸n en RoR es authlogic el cual es de c贸digo abierto y lo podemos usar libremente.

Conceptos base

Lo primero que se tiene que notar es que es c贸digo exclusivamente para el manejo de los usuarios y sus sesiones. Esto quiere decir que no hay generadores (de vistas u otros) y se tienen que hacer algunas modificaciones “a mano” para poder hacer uso de authlogic, sin embargo, las ventajas y claridad que se obtienen a cambio de no tener generadores es algo que se nota a distancia en la complejidad final ya que todo el c贸digo que se escribe, es hecho por el mismo programador y no por un generador no especifico a la aplicaci贸n.

El usuario es aquel modelo en el cual se encuentran los datos que nos importan del mismo como su email, su password (el cual debe de estar cifrado en la base de datos y tambi茅n se tiene que ocultar de los logs de la aplicaci贸n) y otras cosas que queramos tener bajo el control de este modelo, talvez, si es un admin o algunos otros par谩metros. Este modelo lo 煤nico que tiene que incluir es acts_as_authentic con lo cual se activa el modelo de autenticaci贸n de authlogic y el cual incluye un tratamiento para algunas columnas especiales en el modelo como la de crypted_password (que como el nombre lo indica, es el password encriptado).

Por otra parte un usuario s贸lo se podr铆a dar de alta, baja y modificar sus par谩metros, lo que necesitamos para que sea de m谩s uso en nuestra aplicaci贸n es tener una sesi贸n de usuario con la cual el browser podr谩 mantener un indicador para identificar como que usuario esta identificado a trav茅s del recorrer de la aplicaci贸n en las diferentes ventanas que se le muestren al usuario.

Instalaci贸n

Para instalarlo, lo puedes instalar como una gema o lo puedes instalar como un plugin en tu directorio de trabajo

script/plugin install git://github.com/binarylogic/authlogic.git

Con lo cual se ha instalado bajo el directorio

vendor/plugins/authlogic

Usando nifty_generators

Usaremos los nifty-generators se pueden instalar como plugin o como gema.

Creando al usuario, activando authlogic haciendo peque帽as modificaciones

Los nifty_generatos nos dejan especificar algunos par谩metros extra a diferencia de los generadores normales como saltarnos el modelo o nada m谩s generar para el controlador “new” y “edit” como a continuaci贸n se hace para generar el scaffold del usuario

script/generate nifty_scaffold user username:string email:string password:string new edit

Antes de generar la migraci贸n se debe de editar la misma en

db/migrations/timestamp_create_users.rb

Y agregamos al inicio de “password” la palabra “crypted_” tambi茅n agregamos “password_salt” y “persistance_token” que son unas columnas especialmente tratadas por authlogic. Tambi茅n hay que notar que nosotros podemos agregar alguna columna extra como is_admin que esta comentada en este caso.

class CreateUsers < ActiveRecord::Migration
  def self.up
    create_table :users do |t|
      t.string :username
      t.string :email
      t.string :crypted_password
      t.string :password_salt
      t.string :persistence_token
#      t.boolean :is_admin # esto se podr铆a usar como un esquema simple para identificar al admin del sitio, pero no lo usaremos aqu铆.
      t.timestamps
    end
  end
 
  def self.down
    drop_table :users
  end
end

Ya podemos migrar la base de datos

rake db:migrate

Para activar authlogic para el modelo en user.rb se hace agregando la l铆nea acts_as_authentic

class User < ActiveRecord::Base
    acts_as_authentic
end

Ya que al crear el scaffold el password quedo como un campo de texto o un text_field se debe de reemplazar por un password_field y tambi茅n podemos agregar una confirmaci贸n de password confirmaci贸n de password. Se debe de notar que se tienen validaciones preconstruidas para la forma como: checar el formato del email, los usuarios su nick no sean repetidos, no se este usando el mismo o su mail para diferentes usuarios.

  <p>
    <%= f.label :password_confirmation %><br />
    <%= f.password_field :password_confirmation %>
  </p>
  <p>
    <%= f.label :password_confirmation %><br />
    <%= f.password_field :password_confirmation %>
  </p>

Creando la sesi贸n de usuario, m茅todos de ayuda, las rutas de login y logout

Ya que tenemos todo lo que necesitamos para el usuario, crearemos la sesi贸n para que pueda logearse/deslogearse del sistema.

script/generate session user_session

Este generador s贸lo crea un modelo para el manejo de la sesi贸n.

Hasta este momento s贸lo tenemos un formulario para registrar un nuevo usuario pero no tenemos uno para logearnos en el sistema. Para crear nuestra forma de inicio de sesi贸n, lo podemos hacer de esta forma (notar que nos saltamos el modelo ya que lo hemos creado con el generador de session y s贸lo requerimos de crear y eliminar la sesi贸n)

script/generate nifty_scaffold user_session --skip_model username:string password:string new destroy

Finalmente modificamos el controlador de la sesi贸n para que quede como

class UserSessionsController < ApplicationController
  def new
    @user_session = UserSession.new
  end
 
  def create
    @user_session = UserSession.new(params[:user_session])
    if @user_session.save
      flash[:notice] = "Successfully logged in."
      redirect_to root_url
    else
      render :action => 'new'
    end
  end
 
  def destroy
    @user_session = UserSession.find #(params[:id]) se usa la sesion actual no el ID de una sesion
    @user_session.destroy
    flash[:notice] = "Successfully logged out."
    redirect_to root_url
  end
end

En el formulario de la sesi贸n views/user_sessions/new.html.erb se cambia como anteriormente en el formulario de registro el text_field por el password_field.

Para facilitar el manejo de la entrada y salida agregamos unas rutas con nombre a routes.rb que nos servir谩n para referirnos a las acciones login y logout de manera sencilla.

  map.login "login", :controller => "user_sessions", :action => "new"
  map.logout "logout", :controller => "user_sessions", :action => "destroy"

Ahora creemos unos m茅todos de ayuda o helper methods en controllers/application.rb, notar que con filter_parameter_logging se ha evitado guardar como texto en el log los parametros de password y su confirmaci贸n (aunque el segundo no parece ser necesario ya que parece que lo filtra como password*).

class ApplicationController < ActionController::Base
  helper :all # include all helpers, all the time
  filter_parameter_logging :password, :password_confirmation
 
  helper_method :current_user_session, :current_user
 
  private
  def current_user_session
    return @current_user_session if defined?(@current_user)
    @current_user_session = UserSession.find
  end
 
  def current_user
    return @current_user if defined?(@current_user)
    @current_user = current_user_session && current_user_session.record
  end
end

Visualizando la funcionalidad

Los m茅todos de ayuda nos servir谩n finalmente para ver lo que hemos hecho hasta el momento y su acci贸n. Agregamos un div por instancia en nuestro views/layouts/application.html.rb para tener nuestro login, register, logout, edit respecto al usuario y su sesi贸n.

<div id="user_nav">
    <%= link_to "Home", root_path %> | 
    <% if current_user %>
        <%= link_to "Edit profile", edit_user_path(:current) %>
        <%= link_to "Logout", logout_path %>
    <% else %>
        <%= link_to "Register", new_user_path %> |
        <%= link_to "Login", login_path %>
    <% end %>    
</div>

Con esto debemos de contar con las acciones de registrar un usuario, logearnos al sistema y una vez ahi salir de la sesi贸n o modificar los datos del usuario.

Notar que podemos agregar otros m茅todos de ayuda para ver si se trata de un usuario espec铆fico, si es el admin entre otras cosas que podemos hacer respecto a los usuarios, para mayor informaci贸n respecto a las columnas especiales o algunos otros m茅todos de ayuda consultar el authlogic_example disponible como referencia de authlogic.

Comparte esta informaci贸n:
  • Digg
  • Sphinn
  • del.icio.us
  • Facebook
  • Mixx
  • Google Bookmarks
  • BarraPunto
  • LinkedIn
  • Technorati
  • TwitThis

Quiz谩 te interese :

Acerca del autor: tyoc

Deja un comentario


Licencia y uso

Las técnicas demostradas en los tutoriales pueden ser utilizadas sin ninguna limitación y tampoco es obligatorio dar una atribución.


Los textos, imágenes y tutoriales son propiedad de sus respectivos autores, nuestro contenido se encuentra bajo licencia Creative Commons Share-Alike.

Escribe algo para el sitio

El escribir un tutorial o un artículo, mandarnos un enlace para Ubicuos, no solamente es una forma de obtener publicidad, si no también de dar algo a la comunidad y nosotros te lo recompensamos con los premios del mes! Leer más de nuestras promociones

驴Sugerencias?

Este es TU sitio, si tienes sugerencias o ideas de c贸mo podemos mejorarlo para ti, 隆Por favor h谩znoslos saber!

Hacemos nuestro mayor esfuerzo en proporcionar un sitio 煤til y amigable y esperamos que disfrutes tu tiempo aqu铆.

Ayuda a Difundir

Te gusta Ubicuos?

Ve las formas en que nos puedes apoyar.

Apoyando a Ubicuos.com

Submit your linkClose