TIP게시판

제목 로그인 체크 자동화
글쓴이 gwangpa 작성시각 2010/08/05 17:25:11
댓글 : 7 추천 : 1 스크랩 : 2 조회수 : 22964   RSS
 안녕하세요 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랑 똑같네요.
 다음글 CI 라이브러리에 ZendAMF 추가하기 (4)
 이전글 폼검증 set_checkbox() 함수 (2)

댓글

변종원(웅파) / 2010/08/05 18:01:12 / 추천 0

와우. 좋네요.

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

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

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

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

구글링해보세여~
Jeremy / 2011/04/19 05:00:48 / 추천 0
안녕하세요 초보적인 질문하나할께요;;
언뜻생각하기에 페이지가 로드되기 전에 로그인 체크를 해야 될 거 같아서 왠지 pre_controller를 써야 할 것 같은데 post_controller_constructor를 쓰는 이유가 뭐죠?
pre_controller는 컨트롤러가 채 실행 되기도 전에 후킹되는 거라서 문제가 있는건가여?
아무튼 TIP 코드 너무 좋네요~
변종원(웅파) / 2011/04/19 07:34:55 / 추천 0
$this->allow 값때문에 그렇습니다. Config.php에 해당값이 있으면 pre_controller로 사용하시면 돱니다
한대승(불의회상) / 2011/05/11 15:25:15 / 추천 0
아주 좋네요... 고민하고 있던 부분이었는데... 이렇게 간단히 해결이 되는군요. ^^