#21 Super Simple Authentication
Nel precedente episodio vi abbiamo mostrato come visualizzare o nascondere link amministrativi a seconda del fatto che l’utente correntemente loggato fosse o meno admin. Lo abbiamo fatto scrivendo un metodo booleano chiamato admin?
nel nostro ApplicationController
. Se il metodo admin?
restituisce true
allora i link sono mostrati, altrimenti no. Abbiamo lasciato il metodo in una versione banale che restituisce sempre true
; ciò che vogliamo fare oggi è finire di scrivere il metodo e fornire un modo per permettere agli utenti amministrativi di accedere al sito.
C’è più di un modo per farlo
Ci sono molti modi alternativi per implementare il sistema di autenticazione. Potremmo implementare un completo sistema di registrazione utente con un modello User
, una pagina di registrazione e così via. Se volessimo seguire questo approccio, c’è un eccellente plugin chiamato restful_authentication
, che è una versione aggiornata di acts_as_authenticated
, disponibile per il download.1 Una volta installato, il modello utente e un controller chiamato Sessions possono essere generati in questo modo:
$script/plugin install git://github.com/technoweenie/restful-authentication.git restful_authentication $script/generate authenticated User sessions $rake db:migrate
Non useremo però la Restful Authentication in questo caso. Il plugin restful_authentication
sarà trattato più in dettaglio nell’episodio 67.
Il nostro sito è così semplice che non necessita di un intero sistema di autenticazione. Abbiamo solo bisogno di gestire gli episodi sul sito, per cui seguiremo direttamente l’approccio che non necessita di un modello utente o di qualsiasi plugins. Se volessimo seguire un semplicissimo approccio, potremmo restringere l’accesso in base all’indirizzo IP e scrivere il nostro metodo admin?
così.
def admin request.remote_ip == "127.0.0.1" end
Questo approccio è alquanto limitante poichè assume che ogni utenza, soprattutto quella amministrativa, abbia un indirizzo IP statico e che ogni amministratore voglia sempre accedere come tale al sito da una stessa postazione. Anzichè questo, creiamo una semplice pagina di login che richiede solamente una password. Se la password immessa è corretta, l’utente vedrà i collegamenti amministartivi.
La nostra semplice pagina di login.
Per fare questo, generiamo un controller di sessioni. Eccone il codice:
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
C’è anche una semplice vista nella cartella /views/sessions
:
<% form_tag sessions_path do %> Password: <%= password_field_tag :password %> <%= submit_tag "Login" %> <% end %>
La form è mandata all’action create
che memorizza la password in sessione e ridirige alla home page. Nel nostro metodo admin?
possiamo controllare la password nella sessione rispetto a quella corretta e restituire true se sono uguali.
def admin? session[:password] == "secret" end
Fatto!
La nostra semplice pagina di login è ora completa. Benchè non tanto sofisticata quanto potrebbe essere un intero sistema di login come quello fornito dalla Restful Authentication, è buono abbastanza per il nostro semplice sito.
Infine, nel caso vi steste chiedendo come fornire l’url della pagina di login, ciò è fatto aggiungendo queste due linee al file routes.rb
map.connect ’login’, :controller => ’sessions’, :action => ’create’ map.connect ’logout’, :controller => ’sessions’, :action => ’destroy’