2013-05-17 6 views
5

사용자가 로그인되어 있는지 확인하는 가장 안전한 방법은 무엇입니까? 나는 PHP의 프레임 워크, codeigniter를 사용하고있다.사용자가 로그인했는지 확인하십시오.

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

이 코드가 컨트롤러에 있거나보기에 문제가 있습니까?

답변

0

코드가 컨트롤러에 배치되어있어 사용자가 로그인했는지 여부에 따라 적절한보기를 표시 할 수 있습니다. 안전한? 너는 무엇을 피하려고하는거야? CI를 사용하면 is_logged_in 변수를 적절히 설정하는 한 사용자가 현재 로그인되어 있는지 확인하고 확인하는 가장 일반적인 방법입니다.

1

컨트롤러가 _construct 인 경우 컨트롤러에 로그인했는지 여부를 알 수 있습니다. 일치하지 않으면 로그인 화면으로 보내십시오.

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

이것은 컨트롤러에 있어야합니다.

기본 컨트롤러를 만들어 일반 컨트롤러 CI_Controller을 확장하고 문서에서 MY_Controller 개념을 찾아 볼 수도 있습니다. 거기에, 당신은 인증을 확인하고하지 않을 경우 리디렉션하는 방법을 추가 할 수 있습니다, 다음 인증이 필요한 컨트롤러의 메소드를 호출하여

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); 
    } 
} 

:

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'); 
     } 
    } 
} 

다음 컨트롤러를 someOtherMethod()에서 만든 개념을 사용하면 사용자의 인증 상태에 따라 내용을 변경하기 위해보기에서 변수 $logged_in을 사용할 수 있습니다.

2

글쎄, 프리젠 테이션 로직을위한 것입니다.이 경우 컨트롤러에 코드를 저장해야합니다.하지만보기와 관련이있을 경우 (예 : 네비게이션이있는 경우) 기록 된 다른 메뉴를 표시하는 경우 사용자에 당신은 컨트롤러

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

에서 사용할 수있는 컨트롤러에서보기로 변수를 전달하고보기에 당신은

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

가 BU에 foreach 같은 일부 loops를 계속 확인할 수 있습니다 보기에서 메뉴 또는 채우기 (필요한 경우) dropdown e.t.c 및 if.

0

코드는 뷰 파일과 컨트롤러 파일에서 모두 작동하지만 MVC 철학을 위해서 컨트롤러에 코드를 유지하는 것이 더 좋지만 컨트롤러에서 유지하는 것이 더 효율적입니다.

이유는보기 파일이 컨트롤러에서로드되기 때문입니다. 즉, 사용자가 로그인하지 않은 상태에서 제어기 &보기 파일은 계속 해석 할 필요가 없지만 계속 해석됩니다. 컨트롤러에서 세션을 확인하면 컨트롤러에서 세션이 누락되었다는 것을 알게되면 나머지 코드 해석을 중지하고 인증이 필요하지 않은 페이지로 사용자를 리디렉션하는 등의 다른 작업을 수행 할 수 있습니다.

관련 문제