#21 Super Simple Authentication
En el episodio anterior, explicamos como mostrar u ocultar los links de administración dependiendo si el usuario actual es un administrador. Lo hicimos escribiendo un método booleano llamado admin?
en nuestro ApplicationController
. Si el método admin?
devuelve true
entonces los links eran mostrados sino eran ocultos. Dejamos este método devolviendo true
de forma predeterminada. Vamos a terminar de escribir este método y dar una forma para los usuarios administradores de loguearse al sitio.
Hay más de una forma de conseguirlo
Hay muchas formas diferentes de implementar un sistema de logueo. Podríamos implementar un sistema de registración de usuario con un modelo User
, una página de registración y todo lo demás. Pero si pensamos seguir este camino, existe un excelente plugin para descargar 1 llamado restful_authentication
, que es una versión actualizada de acts_as_authenticated
. Una vez instalado, el modelo User y el controlador llamado Sessions pueden ser generados de la siguiente forma:
$script/plugin install git://github.com/technoweenie/restful-authentication.git restful_authentication $script/generate authenticated User sessions $rake db:migrate
No vamos a utilizar Restful Authentication. El plugin restful_authentication
va a ser discutido con mayor detalle en el episodio 67.
Nuestro sitio es tan simple que todo el sistema de administración de usuarios no es necesario. Solamente, vamos a necesitar administrar los episodios en el sitio, asi que vamos a continuar con un método un poco más directo que no requiere un modelo User o plugins. Si quisiéramos hacerlo realmente simple, podríamos restringir el acceso por dirección IP y escribir nuestro método 'admin?
' de la siguiente forma.
def admin request.remote_ip == "127.0.0.1" end
Esto es un poco limitante, debido a que asume que nuestra conexión a Internet tiene una dirección IP estática y que siempre se va a querer administrar el sitio cuando se ingresa desde esa dirección IP. En cambio, vamos a hacer una simple página de login que tomorá una clave. Si la clave que se ingresa es correcta, entonces el usuario verá links de administración.
Nuesta básica página de login.
Para hacer esto, vamos a generar un controlador de Sesión. El código sería:
class SessionsController < ApplicationController def new end def create session[:password] = params[:password] flash[:notice] = ’Successfully logged in’ redirect_to home_path end def destroy reset_session flash[:notice] = ’Successfully logged out’ redirect_to login_path end end
También, hay una nueva vista básica en la carpeta /views/sessions
.
<% form_tag sessions_path do %> Password: <%= password_field_tag :password %> <%= submit_tag "Login" %> <% end %>
El formulario es enviado a la acción create
que almacena la clave ingresada en la sesión, y luego redirecciona a la página de inicio. En nuestro método admin?
, vamos a comparar la clave de la sesión con la clave correcta y devolveremos true si coinciden
def admin? session[:password] == "secret" end
¡Listo!
Nuestra página básica de login está terminada. No es tan sofisticada como un sistema completo de administración de usuarios como el que da Restful Authentication, pero es lo suficientemente bueno para servir para nuestro simple sitio.2
Finalmente, en caso que se pregunte como le asignamos la url '/login' a la página login, lo hacemos agregando estas dos rutas en routes.rb
.
map.connect ’login’, :controller => ’sessions’, :action => ’create’ map.connect ’logout’, :controller => ’sessions’, :action => ’destroy’
Notas
- http://github.com/technoweenie/restful-authentication/tree/master
- Cabe mencionar la existencia de Devise (http://github.com/plataformatec/devise) que es explicado con mayor detalle en los episodios 209 y 210.