Oggi vedremo come sia semplice creare una area protetta da username e password nella nostra applicazione, sfruttando alcune caratteristiche e CodeIgniter.
Controller e form di login
Nella scorsa puntata abbiamo modificato il nostro template in modo da utilizzare Twitter Bootstrap come framework CSS. Ne abbiamo approfittato quindi per aggiungere alcuni elementi specifici per gestire l’accesso come administrator del sito:
- pulsante di login e di logout in alto a destra nella navbar, visibili alternativamente a seconda che sia stato eseguito l’accesso oppure no;
- riquadro contenente una notifica “Logged in as admin‘, appena sotto alla medesima area, per ricordarci in ogni momento che abbiamo eseguiro l’accesso.
Pulsante di login:
Pulsante di logout:
CodeIgniter, mantenendosi fedele allo propria filosofia minimalista, non fornisce un metodo standard per gestire la login; ciononostante vedremo quanto sia semplice realizzare questa funzionalità con poche righe di codice. Iniziamo dal controller: abbiamo visto che entrambi i link di login e logout hanno un path che inizia per ‘login/’, saranno quindi gestiti da un controller che avrà lo stesso nome, creiamo dunque il sorgente in application/controllers/login.php:
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); class Login extends CI_Controller { function __construct() { parent::__construct(); // carica configurazione $this->config->load('login'); } /** * carica form di login */ public function index() { $data['main_content'] = 'login_form'; $this->load->view('includes/template', $data); } /** * Distrugge la sessione e redireziona sulla homepage */ public function logout() { $this->session->sess_destroy(); redirect('/'); } /** * Valida username e password */ public function validate_credentials() { $username = $this->input->post('username'); $password = $this->input->post('password'); if ($username == $this->config->item('login_admin_username') && $password == $this->config->item('login_admin_password')) { // se è tutto ok, salva 'username' e 'logged_in' in sessione $data = array( 'username' => $username, 'logged_in' => true ); $this->session->set_userdata($data); redirect('collection/index'); } else { // altrimenti mostra messaggio d'errore e torna sul form $this->session->set_flashdata('errorMessages', 'combinazione username/password non valida'); $this->index(); } } }
Il codice dovrebbe essere commentato a sufficienza, ma vogliamo comunque far notare alcuni accorgimenti che abbiamo adottato.
Per prima cosa, all’interno del metodo costruttore __construct() venga caricata la configurazione ‘login’, ciò si traduce nel caricamento del file application/config/login.php:
<?php $config['login_admin_username'] = 'admin'; $config['login_admin_password'] = 'admin';
Queste voci di configurazione memorizzano l’accoppiata username/password da utilizzare per accedere all’area protetta.
Attenzione! Per mantenere sicura la vostra installazione questo file va modificato prima o subito dopo aver copiato i file sullo spazio web, per evitare accessi indesiderati tramite username e password di default!
Il metodo validate_credentials() si occupa della gestione dell’invio di username e password, controllando che corrispondano alla configurazione di cui sopra; in caso di errore memorizza un messaggio in un’area speciale della sessione di CodeIgniter chiamata flashdata; i dati memorizzati in flashdata vengono “dimenticati” una volta letti, tipicamente questo strumento si utilizza per mostrare dei messaggi dopo una redirect.
Ecco infine il codice per il form di login, da salvare in application/vies/login_form.php:
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); ?> <h2>Login</h2> <?php echo form_open('login/validate_credentials', array('class' => 'form-vertical')); ?> <label>Username</label> <?php echo form_input('username'); ?> <label>Password</label> <?php echo form_password('password'); ?> <br /><button type="submit" class="btn">Login</button> <?php echo form_close(); ?>
In questa immagine possiamo vedere come si presenta, nel tipico stile pulito e preciso di Twitter Bootstrap:
Controllo accessi
Nel Login controller abbiamo visto come, dopo aver fatto la login, venga impostata una variabile logged_in a true nella session; grazie a questo accorgimento possiamo ora realizzare un controllo di sicurezza per stabilire se l’utente è autorizzato o meno ad utilizzare alcune funzionalità dell’applicazione; è sufficiente infatti controllare che questa esista, ed in caso contrario mostrare un messaggio d’errore. Come esempio prendiamo il controller Admin (che vedremo più in dettaglio più avanti):
class Admin extends CI_Controller { function __construct() { parent::__construct(); $this->_isLoggedIn(); // ecc.. } private function _isLoggedIn() { $logged_in = $this->session->userdata('logged_in'); if (!isset($logged_in) || $logged_in != true) { echo 'Permission denied<br />' . anchor('login/index', 'Login'); die(); } } }
Sviluppi
Ora che abbiamo una sezione protetta e un controller Admin, abbiamo l’infrastruttura di base per poter gestire le collezioni e le fotografie. Nel prossimo appuntamento quindi ci occuperemo di questo controller, che sarà davvero un punto centrale (e molto complesso!) di Photocloud. Alla prossima!