TIP게시판

제목 초보팁] 모든 페이지에서 로그인여부 검사하기
글쓴이 마PD 작성시각 2016/02/12 18:26:22
댓글 : 3 추천 : 0 스크랩 : 3 조회수 : 5780   RSS

다음 글의 도움을 받았습니다.

 

TIP게시판, [로그인 체크 자동화] : http://codeigniter-kr.org/bbs/view/tip?idx=8009

강좌게시판, [심플하게 hook 사용 방법] : http://cikorea.net/bbs/view/lecture?idx=12894&page=1&hit=not&lists_style=

CI 묻고 답하기, [로그인 여부 체크하기] : http://codeigniter-kr.org/bbs/view/qna?idx=12891&page=1&view_category=&lists_style=

CI 묻고 답하기, [hook 사용시 이해가 잘 안되는 점..] : http://codeigniter-kr.org/bbs/view/qna?idx=12879&page=1&view_category=&lists_style=

 

오늘 하루종일 삽질하고 얻은 결과를 정리했습니다.^^

틀린게 있으면 지적 부탁드립니다.

 

1. 모든 페이지에서 로그인여부를 검사하기

-> 관리자 툴, 인트라넷 등 모든 페이지가 로그인을 한 사용자에게만 보여줘야할때.

-> 로그인을 하지 않은 사용자는 강제로 로그인창으로 이동.

 

2. 사용된 것들(?)

- 세션

- DB

- hooks

- url(router)

등.

 

3. 구성도

사용자가 접속한다. -> hooks를 통해 로그인 여부를 먼저 확인한다. -> 로그인 여부는 세션으로 검증한다. ---->

(1)--> 로그인 사용자일 경우 -> 메인 컨텐츠로 이동

(2)--> 로그인을 하지 않은 사용자 -> 로그인 화면으로 이동

 

 

4. 만들기

 1) application/config/config.php 에서 hooks 를 활성화 시킨다.

$config['enable_hooks'] = TRUE;

 

 

 2) application/config/hooks.php 에 작동할 파일 및 클래스, 함수 등을 입력한다.

(hooks를 사용함으로써 모든 페이지에 로그인 여부를 검사하는 부분을 추가하는 것.)

$hook['post_controller_constructor'][] = array(
    'class'     => 'Log',
    'function'  => 'checkPermission',
    'filename'  => 'Log.php',
    'filepath'  => 'hooks'
);

 

 

 3)  실제로 작동할 Log.php 파일을 만들어 준다. 

application/hook/Log.php

<?php
class Log {
	function checkPermission()
	{
		$CI =& get_instance();
		$CI->load->library('session');
		$CI->load->helper('url');
		if(isset($CI->allow) && (is_array($CI->allow) === false OR in_array($CI->router->method, $CI->allow) === false))
// 여기에 쓰인 if문을 이해하는데 한참 걸렸습니다..
// $CI->allow 는 배열로, 추후 로그인 없이 사용 가능한 것들을 저장할때 사용합니다.
// 가령 로그인 화면이나 문의화면 같이 비로그인으로 열어줄 것들을 넣어주게 됩니다.
		{
			if (!$CI->session->userdata('userid')) // 로그인 여부를 세션을 이용해 체크한다.
			{ 
				redirect(''); // 로그인창으로 강제 이동
			}
		}
	}
}
?>

 

 

 4) 자, 이제 로그인 화면을 띄워줄 컨트롤러를 만들어 줍니다.

저는 첫 컨트롤러로 Main 이라는 이름을 가진 컨트롤러를 사용 합니다.

<?php
defined('BASEPATH') OR exit('No direct script access allowed');

class Main extends CI_Controller {

    function __construct()
    {       
        parent::__construct();
        $this->allow=array('login');
    }

	public function login()
	{
        // 이곳에서 로그인 관련 작업을 수행하면 됩니다.
	}

}

 

 

5. 그 외에 사용하는 모든 컨트롤러에서도 로그인 없이 사용할 수 있는 함수들을 정해줍니다.

저의 경우는 위의 메인에서 사용하는 로그인 말고는 열어줄게 없어서 다음과 같이 처리 했습니다.

controllers/sample.php

<?php
defined('BASEPATH') OR exit('No direct script access allowed');

class Sample extends CI_Controller {

    function __construct()
    {       
        parent::__construct();
        $this->allow=array();
    }
}

-> 이렇게 해주지 않으면 그냥 접속이 되더라구요. ㅠ.ㅠ

 다음글 DB TABLE column comment 를 이용한 ... (3)
 이전글 aptana 에서 ftp 저장시 오류원인 (4)

댓글

변종원(웅파) / 2016/02/16 16:33:06 / 추천 0
잘 정리해주셨네요. ^^
강동원 / 2017/01/12 01:28:07 / 추천 0
감사합니다.
한대승(불의회상) / 2017/01/12 09:42:46 / 추천 0

hook 사용법 끝판왕이네요.

감사 합니다. ^^