2013-05-17 13 views
5

Jaki jest najbezpieczniejszy sposób sprawdzenia, czy użytkownik jest zalogowany? Używam framework php, codeigniter.sprawdzanie, czy użytkownicy zalogowali się

$loggedIn = $this->session->userdata('is_logged_in'); // returns 1 
if($loggedIn == true): ?> 
    // do something 
<?php endif; ?> 

Czy ma znaczenie, czy ten kod znajduje się w kontrolerze, czy w widoku?

Odpowiedz

0

Kod jest lepiej umieszczony w kontrolerze, dzięki czemu można wyświetlić właściwy widok na podstawie tego, czy użytkownik jest zalogowany, czy nie. Bezpieczne? Czego próbujesz uniknąć? W przypadku CI jest to najczęstszy sposób sprawdzenia, czy użytkownik jest aktualnie zalogowany ... o ile ustawisz prawidłowo zmienną is_logged_in.

1

Po uzyskaniu _construct kontrolera, można sprawdzić, czy jest on zalogowany, czy nie, od początku. Jeśli nie są, wyślij je na ekran logowania:

function __construct() { 
    parent::__construct(); 
    if (!$this->session->userdata('logged_in')) { 
      redirect('YourLoginController'); 
    } 
} 

To zdecydowanie powinno być w kontrolerze.

Można także utworzyć kontroler podstawowy, aby rozszerzyć standardową wersję CI_Controller, zapoznaj się z koncepcją MY_Controller w dokumencie. Tam można dodać metodę, która sprawdza uwierzytelnienia i przekierowuje jeśli nie, a następnie połączyć je w swoich metodach kontrolerów, które wymagają uwierzytelnienia:

class MY_Controller extends Controller{ 
    public $data = array(); 
    function _construct() { 
     parent::_construct(); 
     $data['logged_in'] = $this->session->userdata('logged_in'); 
    } 

    function authenticated() { 
     if (!$this->data['logged_in']) { 
      redirect('YourLoginController'); 
     } 
    } 
} 

, a następnie w kontrolerze:

class Some_Controller extends MY_Controller { 
    function _construct() { 
     parent::_construct(); 
    } 

    // If a method requires authentication 
    function someMethod() { 
     $this->authenticated(); //This does nothing if logged in 
           //It redirects to login if not logged in 
     //Your stuff. 
    } 

    //If a method DOESN'T require login, your $this->data to 
    //pass to the view has already been started from MY_Controller 
    //so append the display content you need to that array and 
    //then pass it to the view 
    function someOtherMethod() { 
     $this->data['somecontent'] = "I'm content"; 
     $this->load->view('someView',$this->data); 
    } 
} 

Używanie koncepcja utworzona z poziomu someOtherMethod() można następnie wykorzystać zmienną $logged_in w celu zmiany zawartości na podstawie statusu uwierzytelniania użytkownika.

2

Widok jest przeznaczony do prezentacji, w takim przypadku należy zachować kod w kontrolerze, ale jeśli jest on związany z widokiem, na przykład, jeśli masz nawigację i jeśli wyświetlasz inne menu dla zalogowanego użytkownika w użytkownika można użyć w kontrolerze

$loggedIn = $this->session->userdata('is_logged_in'); 
// .... 
$data['loggedIn'] = $loggedIn; 
$this->load->view('viewname', $data) 

i przekazać zmienną do widoku z kontrolera, a następnie w widoku można sprawdzić

<?php if($loggedIn): ?> 
    // Show menu for logged in user 
<?php else: ?> 
    // Show a different menu 
<?php endif; ?> 

Przechowywać tylko trochę loops jak foreach do bu ild menu lub wypełnianie instrukcji dropdown e.t.c i if (w razie potrzeby) w widoku.

0

Podczas gdy kod będzie działał zarówno w widoku, jak iw plikach kontrolera, lepiej jest zachować kod w kontrolerze nie tylko ze względu na filozofię MVC, ale jest również bardziej wydajny, aby zachować go w kontrolerze.

Powodem jest to, że pliki widoku są ładowane ze sterowników. Oznacza to, że jeśli użytkownik nie jest zalogowany, pliki widoku kontrolera będą nadal interpretowane, chociaż nie muszą. Jeśli sprawdzisz sesję w kontrolerze, kiedy kontroler dowie się, że sesja nie istnieje, może przestać interpretować resztę kodu i wykonać inne czynności, takie jak przekierowanie użytkownika na strony, które nie wymagają uwierzytelnienia.

Powiązane problemy