CodeIgniter 한국사용자포럼 BETA
빠르고, 유연한 PHP Framework!

TIP게시판


로그인 체크 자동화      
gwangpa 7 3,333 0 0 2010-08-05 17:25:11
 안녕하세요 CI초보 입니다. 이번 프로젝트에 CI를 도입하려고 이것저것 테스트를 해 보고 있는 중입니다. 
 
페이지별로 로그인 체크를 하려다 보니, 코드가 좀 어지럽고 버그가 나올 가능성이 농후해 보여서, 이 부분을 좀더 자동화? 시키는 방법을 생각했고, 그 내용을 공유 하고자 합니다. 
 
CI를 사용하기 전에는 CakePHP를 사용한지라 CakePHP와 거의 비슷하게 했습니다. ^^; 
 
일단 컨셉은 이렇습니다. 
컨트롤러 인스턴스가 생성이 될때에 컨트롤러에 설정된 로그인 없이 접근이 가능한 메소드(액션) 정의를 확인하고, 컨트롤러의 메소드(액션)이 실행되기 전에 설정값과 인증 여부를 확인하여 접근이 불가능 하면 로그인 페이지로 이동일 시킨다. 입니다. 
 
컨트롤러 인스턴스가 실행될때에 어떤 기능을 실행을 시켜야 하는데 알아보니 CI에서는 hook이라는게 있고 그중에 제가 원하는 시점이 post_controller_contruct 가 있더군요. 
그래서 일단 hook이 가능하게 config를 수정 했습니다. 
 
application/config/config.php
$config['enable_hooks'] = TRUE;
 
 
그 다음에는 hook을 설정합니다. 
$hook['post_controller_constructor'][] = array(
    'class'     => 'Acl', // 뭐 이름은 Acl이라고는 했는데 적당히.. ㅎㅎ
    'function'  => 'checkPermission',
    'filename'  => 'Acl.php',
    'filepath'  => 'hooks'
);
 
 
 
이렇게 하고 저 설정에 맞게끔 파일을 생성합니다. 
application/hook/Acl.php
<?php
class Acl {
    function checkPermission() {
        $CI =& get_instance();
        if (isset($CI->allow) && (is_array($CI->allow) === false OR in_array($CI->router->method, $CI->allow) === false)) {
            if (1) { // 로그인을 했는지 판단을 하는 로직을 넣으면 되겠죠. 
                // redirect url도 알아서... 
                redirect('/account/signin?next=' . urlencode($CI->uri->ruri_string()));
            }   
        }   
    }   
}
?>
 

그리고 컨트롤러에서 로그인없이도 허용할 수 있는 메소드명을 정의 합니다. 
application/controller/welcome.php
<?php
class Welcome extends Controller {
    function Welcome() {
        parent::Controller();
        $this->allow = array('index', 'method1', 'method2'); // index, method1, method2 메소드만 로그인 접근이 가능하게 설정한 것입니다. 
    }   
 
    function index() {
    }
    function method1() {
    }
    function method2() {
    }
}
?>
 

이렇게 해서 컨트롤러마다 construct 부분에 로그인 없이 접근 가능한 메소드명만 적어 놓으면 됩니다.

해놓고 나니까 이거 완전히 CakePHP랑 똑같네요.
  목록  

웅파 2010-08-05 18:01:12
  

와우. 좋네요.

$this->allow에 해당하는 내용을 xml 정도로 떨구고 (컨트롤러-메소드)
전체 프로그램에서 사용해도 괜찮겠네요.

아니면 특정 디렉토리에 있는 컨트롤러는 모두 로그인을 시킨다던지 하는 응용도 가능하구요.
(야후 bouncer 라는 로그인 시스템에서 apache와 연계하여 이용중)

gwangpa 2010-08-05 18:27:41
  
특정 디렉토리는 어떤 의미인지 잘 모르겠네요... 
application/directory/controller_name.php 이렇게도 가능한건가요?
(라고 글을 쓰다가 테스트 해 봤는데 저렇게도 되네요.. ㅎㅎ)
config파일을 이용하면 클래스 마다 설정을 생략할 수도 있겠어요.
kirrie 2010-08-07 11:32:30
  
cakephp는 접근제어를 기본 라이브러리로 제공하는데 ci에서는 그게 없어서 저도 처음에는 좀 어리둥절했죠. ㅎㅎ
좀 더 다듬어서, 그룹 -> 사용자 등의 권한 상속이라던가 하는 부분도 처리하게 만들어주세요. ^^
부탁드림당!
케이든 2010-08-07 14:02:52
  
//kirrie

예전에 젠드 acl 가져다가 쓰는 사람도 본거같은데

구글링해보세여~
Jeremy 2011-04-19 05:00:48
  
안녕하세요 초보적인 질문하나할께요;;
언뜻생각하기에 페이지가 로드되기 전에 로그인 체크를 해야 될 거 같아서 왠지 pre_controller를 써야 할 것 같은데 post_controller_constructor를 쓰는 이유가 뭐죠?
pre_controller는 컨트롤러가 채 실행 되기도 전에 후킹되는 거라서 문제가 있는건가여?
아무튼 TIP 코드 너무 좋네요~
웅파 2011-04-19 07:34:55
  
$this->allow 값때문에 그렇습니다. Config.php에 해당값이 있으면 pre_controller로 사용하시면 돱니다
불의회상 2011-05-11 15:25:15
  
아주 좋네요... 고민하고 있던 부분이었는데... 이렇게 간단히 해결이 되는군요. ^^
번호 제   목 글쓴이 날짜 조회 추천수
829 HMVC 5.4 & Template_ 타로구조 만들기 [1] 타로 2012-02-02 100 0
824 CI lang팩 -> Javascript lang팩 [4] KangMin 2012-01-25 184 0
823 anchor_popup 헬퍼 화면 정 가운데 띄우기.. [0] DJ구스 2012-01-17 149 0
822 [자바스크립트] 창을 화면 정중앙에 위치하게 계산하기 [0] 웅파 2012-01-11 182 0
815 hook에서 선언한 변수를 컨트롤러에서 사용하기 [2] 웅파 2011-12-27 368 0
812 mysql 부분적인 에러 핸들링 처리 [2] EziX 2011-12-20 390 0
811 컨트롤러 외부에서의 종료방법 [1] EziX 2011-12-20 302 0
809 icodekore sms 모듈 쓰는 분들 참고하세요.. [0] namGoos 2011-12-09 514 0
803 Upgrading from 2.0.3 to 2.1.0 [5] namGoos 2011-12-06 493 0
794 .svn 폴더 삭제 하기 [7] 불의회상 2011-11-30 452 1
792 [1원] 윈도우서버+mssql 에서 CLI(Comm.. [2] 터프키드 2011-11-29 458 0
786 Form_validation 라이브러리 less_t.. [2] EziX 2011-11-17 460 0
780 1원팁. 저의 Template_ 이용방법입니다. [2] namGoos 2011-10-31 995 0
773 MYSQL 자동으로 시간 설정 [5] 불의회상 2011-10-26 659 0
767 모바일 웹사이트 개발시 참조하시면 좋을 것 같네요~ [7] 탱크 2011-10-20 781 1
764 EUC-KR 판정 방법 [3] 불의회상 2011-10-18 727 0
758 eclipse Autocomplete 업데이트 버전. [4] EziX 2011-10-14 937 0
751 글로벌 사이트를 위한 시간(GMT) 적용 [8] 웅파 2011-10-12 518 0
744 포토바다 개발 내규 문서 공개합니다. [7] namGoos 2011-10-10 846 1
735 jquery cheat 1.0 ~ 1.6 [6] 웅파 2011-10-06 759 0