2010-09-29 20 views
5

Ho creato una registrazione e accesso per il mio sito Web e tutte le convalide funzionano bene sia per l'iscrizione che per l'accesso. Dopo che l'utente ha fornito le credenziali valide, viene inserito nell'area membro con un messaggio di benvenuto che dice Hello first_name last_name .. fondamentalmente il nome e il cognome vengono acquisiti dal database.Qual è la procedura migliore per limitare le pagine specifiche agli utenti registrati solo in Codeigniter?

Qualsiasi cosa io voglia fare è limitare l'area membro solo agli utenti registrati. Tutti gli altri verranno reindirizzati alla pagina iniziale o alla pagina di accesso o dove mai deciderò di dover essere reindirizzati a.

Io uso ci_sessions che sono memorizzati in una tabella "ci_sessions" nel mio database. Session_id, ip_address, user_agent, last_activity e user_data sono le colonne. Quindi penso che sia una forma di sicurezza piuttosto che avere un cookie memorizzato sul browser degli utenti, ce ne sono altri.

Ad ogni modo proprio ora per impedire a chiunque altro di accedere agli utenti registrati per accedere alla mia area membro del sito, ad es. http://mysite.com/member_area Io uso una semplice istruzione if nel mio controller per l'area membro:

if (! $this->session->userdata('first_name')) 
    { 
    redirect('login'); 
} 

Questo controlla per vedere se la persona che sta tentando di accedere alla pagina zona socio ha un qualche tipo di dati memorizzati in user_data in mia tabella ci_sessions come ad esempio un first_name e in tal caso consente loro di accedere alla pagina che significa che devono aver effettuato l'accesso e avere ancora una sessione attiva.

Se non viene trovato nulla nel database, vengono reindirizzati alla pagina di accesso dei siti Web. Quello che voglio sapere è se c'è un modo migliore per farlo? Il modo in cui lo sto facendo ora è abbastanza sicuro?

Qui di seguito è il mio modello di codice:

<?php 
class Current_User { 

    private static $user; 

    private function __construct() {} 

    public static function user() { 

     if(!isset(self::$user)) { 

      $CI =& get_instance(); 
      $CI->load->library('session'); 

      if (!$user_id = $CI->session->userdata('user_id')) { 
       return FALSE; 
      } 

      if (!$u = Doctrine::getTable('User')->find($user_id)) { 
       return FALSE; 
      } 

      self::$user = $u; 
     } 

     return self::$user; 
    } 


    public static function login($email, $password) { 

     // get User object by email 
     if ($u = Doctrine::getTable('User')->findOneByEmail($email)) { 


      // to ge the mutated version of the input password 
      $u_input = new User(); 
      $u_input->password = $password; 

      // password match 
      if ($u->password == $u_input->password) { 


       $CI =& get_instance(); 
       $CI->load->library('session'); 
       $CI->session->set_userdata('user_id',$u->id); 
       $CI->session->set_userdata('username',$u->username); 
       $CI->session->set_userdata('first_name',$u->first_name); 
       $CI->session->set_userdata('last_name',$u->last_name); 

       self::$user = $u; 

       return TRUE; 
      } 

      unset($u_input); 
     } 

     // login failed 
     return FALSE; 

    } 


    public function __clone() { 
     trigger_error('No duplicates allowed.', E_USER_ERROR); 
    } 

} 

Tutto il tuo consiglio è apprezzato.

UPDATE

ne dite di aggiungere questo per il mio modello

$CI->session->set_userdata('logged_in', 'TRUE'); 

Questo aggiunge fondamentalmente "logged_in" per i miei dati utente in sessione nel DB con il valore "TRUE". nel mio controller per il mio "zona membro" Ho modificato l'istruzione if a dire questo:

if (! $this->session->userdata('logged_in')==TRUE) 
{ 
redirect('login'); 

}

Se l'articolo non esiste ", che non lo farà se un isn utente' t loggato "allora verrà restituito FALSE e l'utente verrà reindirizzato alla pagina di login

Cosa ne pensi?

oppure potrei anche rendere TRUE qualcosa di segreto come dsb453rerfksdhbdsks322 per esempio. Qualcosa di casuale.

risposta

10

Hai colpito il chiodo sulla testa, ma c'è un modo leggermente più efficiente per farlo.

estendere il controller di base, in un modo (credo che originariamente delineato da Phil Sturgeon), ma cercherò di riassumere qui:

Vedi this article per un tempo molto approfondita write up.

ma in sostanza:

<?php 
class MY_Controller extends Controller 
{ 
    function __construct() 
    { 
     parent::Controller(); 
     if (! $this->session->userdata('first_name')) 
     { 
      redirect('login'); // the user is not logged in, redirect them! 
     } 
    } 
} 

Così ora se si desidera limitare l'accesso, semplicemente:

class Secret_page extends MY_Controller { 

// your logged in specific controller code 
} 

e il controller estesa controllerà automaticamente se l'utente è connesso nel costruttore.

come per come, probabilmente impostare user_id come valore per verificare se è il suo set, o forse un "gruppo" di utenti - quindi è possibile ottenere autorizzazioni utente e vari livelli di accesso nel sistema.

spero che questo aiuti un po '.

modificare

aggiungere questo application/config.php

/* 
| ------------------------------------------------------------------- 
| Native Auto-load 
| ------------------------------------------------------------------- 
| 
| Nothing to do with cnfig/autoload.php, this allows PHP autoload to work 
| for base controllers and some third-party libraries. 
| 
*/ 
function __autoload($class) 
{ 
    if(strpos($class, 'CI_') !== 0) 
    { 
     @include_once(APPPATH . 'core/'. $class . EXT); 
    } 
} 

Come si utilizza CI 2.0, è necessario posizionare i MY_Controllers all'interno Application/core invece di biblioteche.

My Application/core Sembra un po 'come:

Admin_Controller.php 
MY_Controller.php 
Public_Controller.php 
+0

Sì grazie mille. Leggerò l'articolo di Phil Sturgeon per capire meglio. Un'altra cosa che ho notato è che anche se non sono loggato nell'ID di sessione, user_agent, ip, last_active sono memorizzati/aggiornati nel database. Ora posso immaginare milioni di persone che navigano nel sito web senza essere loggati. È così male? Non dovrebbe solo registrare le informazioni degli utenti registrati? se no c'è un modo per ottenerlo per distruggere questi dati o non registrarli del tutto se l'utente non ha effettuato l'accesso? – LondonGuy

+0

Errore irreversibile: Classe "MY_Controller" non trovata in ... Penso che sia un bug di codeignitet 2.0 – LondonGuy

+0

nada, è necessario utilizzare PHP5 che ricarica automaticamente la magia. vedi il mio post modificato – Ross

0

io uso qualcosa di simile:

$user_session = $this->model_user_lite->Session_Check(); 
    if ($user_session == FALSE) 
    { 
     redirect('main/about'); 
     exit(); 
    } 
    $data['auth'] = $user_session; 
    $user_id = $this->model_user_lite->Session_UserID(); 

di proteggere non il controller, ma le funzioni per conto proprio, che a mie opinioni è più efficiente. Il codice è abbastanza auto spiegando, tuttavia ho messo l'assegno sessione di troppo:

function Session_Check ($return_link = FALSE) 
{ 

    $auth = $this->session->userdata('logged_in'); 
    if ($auth == FALSE) 
    { 
     $return_value = FALSE; 
    } 
    else 
    { 
     $return_value = TRUE; 
    } 

    return $return_value; 

} 

modo in cui l'utente accede, abbiamo appena impostato l'userdata "logged_in" TRUE e controlliamo ogni volta che vogliamo.

Spero che aiuti!

0

Non penso che sia un lavoro di controller implementare la sicurezza, dovrebbe solo controllarlo. È possibile codificare la logica di autenticazione in una libreria. Successivamente, carica automaticamente quella libreria. Nei metodi del controller che servono contenuti protetti, puoi semplicemente fare questo:

$ this-> auth-> restrict();

Problemi correlati