Home / Programmazione / PHP / Login con Codeigniter
Mattepuffo

Login con Codeigniter

Login con Codeigniter

Continua lo studio di questo ottimo framewrok, che probabilmente adotterò per un mio prossimo lavoro.

Oggi vediamo come creare un semplice sistema di login.

Prima di tutto assicuratevi di caricare automaticamente due librerie e due helper; andate in application -> config -> autoload.php:

$autoload['libraries'] = array('database', 'session');
$autoload['helper'] = array('url', 'form');

Poi in application -> config -> config.php potete impostare le sessioni:

$config['sess_cookie_name'] = 'my_session';
$config['sess_expiration'] = 7200;
$config['sess_expire_on_close'] = TRUE;
$config['sess_encrypt_cookie'] = FALSE;
$config['sess_use_database'] = FALSE;
$config['sess_table_name'] = 'my_sessions';
$config['sess_match_ip'] = FALSE;
$config['sess_match_useragent'] = TRUE;
$config['sess_time_to_update'] = 300;

Oltre al nome della sessione ho anche cambiato il parametro sess_expire_on_close in modo che alla chiusura del browser la sessione si chiuda.

Dopo questa configurazione base passiamo alla view:

<fieldset>
    <legend>Login</legend>
    <?php echo validation_errors(); ?>
    <?php echo form_open('login/dologin'); ?>
    <table>
        <tbody>
            <tr>
                <td>User:</td>
                <td><input type="text" name="username" value="" /></td>
            </tr>
            <tr>
                <td>Password:</td>
                <td><input type="password" name="password" value="" /></td>
            </tr>
            <tr>
                <td></td>
                <td><input type="submit" value="Login" name="submit" /></td>
            </tr>
    </table>
</form>
</fieldset>

Un semplice form che richiama la funzione dologin del nostro controller login.

A questo punto ci rimangono i due punti fonamentali: il controller e il model.

 

Cominciamo dal primo:

<?php

class Login extends CI_Controller {

    function __construct() {
        parent::__construct();
        $this->load->model('login_model', 'username', TRUE);
    }

    public function index() {
        if ($this->session->userdata('logged_in')) {
            redirect('home', 'refresh');
        } else {
            $data = array();
            $data['titolo'] = 'Login';
            $this->load->view('header', $data);
            $this->load->view('login_view', $data);
            $this->load->view('footer');
        }
    }

    public function doLogin() {
        $this->load->library('form_validation');
        $this->form_validation->set_rules('username', 'Username', 'trim|required');
        $this->form_validation->set_rules('password', 'Password', 'trim|required|sha1|callback_check_database');
        if ($this->form_validation->run() == FALSE) {
            $data = array();
            $data['titolo'] = 'Login';
            $this->load->view('header', $data);
            $this->load->view('login_view', $data);
            $this->load->view('footer');
        } else {
            redirect('home', 'refresh');
        }
    }

    function check_database($password) {
        $username = $this->input->post('username');
        $result = $this->username->login($username, $password);
        if ($result) {
            $sess_array = array();
            foreach ($result as $row) {
                $sess_array = array(
                    'id' => $row->id,
                    'username' => $row->utente
                );
                $this->session->set_userdata('logged_in', $sess_array);
            }
            return TRUE;
        } else {
            $this->form_validation->set_message('check_database', 'Invalid username or password');
            return FALSE;
        }
    }

}

Nella funzione index facciamo un semplice controllo se è stata settata la varibile logged_in; in caso sia settata rimandiamo a home, sennò richiamiamo la view per effettuare il login.

Poi c'è la funzione richiamata dal form; questa funzione prende i valori passati dal form e li passa alla funzione check_database che controlla i valori con quelli presi dal database.

Se i valori sono giusti c'è il redirect a home, sennò ci appariranno gli errori di validazione.

Infine il model:

<?php

class Login_model extends CI_Model {

    public function login($username, $password) {
        $this->db->select('*');
        $this->db->from('utenti');
        $this->db->where('utente', $username);
        $this->db->where('password', $password);
        $query = $this->db->get();
        if ($query->num_rows() == 1) {
            return $query->result();
        } else {
            return FALSE;
        }
    }

}

La funzione esegue una query e controlla se c'è un risultato.

Per esguire il logout basta creare un link che richiama una funzione logout;

<a href="home/logout">Logout</a>

Poi:

public function logout() {
        session_start();
        $this->session->unset_userdata('logged_in');
        session_destroy();
        redirect('home', 'refresh');
    }

Semplicemente fal l'unset della varibile di sessione creata prima.