RoR: authlogic
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_sessionEste 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.
Quiz谩 te interese :
Un RSS o Really Simple Sindication o tambi茅n Rich Site Summary, nos sirve para sindicar o anotar ...
Creaci贸n de un nuevo proyecto Rails para tu blog Antes de poder hacer cualquier cosa, tiene que ...
Muchas veces hemos tenido necesidad de darle a alguna de nuestras aplicaciones, la capacidad de ...





