<?php
/**
 * ZBXE authentication backend
 * DokuWiki용 제로보드 XE 인증 모듈
 *
 * @license    Creative Commons 3.0 (원저작자 표시 조건 의무)
 * @author     Venister (Joongpil Cho) <venister@empal.com>
 */
class auth_zbxe extends auth_basic {
    var $url = array();
 
    function auth_zbxe() {
        global $conf;
 
        define('__ZBXE__', true);
 
        $config_file =  $conf['auth']['zbxe']['path']."files/config/db.config.php";
        require_once ($config_file);
 
        $this->url['path'] = $conf['auth']['zbxe']['path'];
        $this->url['db_prefix'] = $db_info->db_table_prefix;
        $this->url['host'] = $db_info->db_hostname;
        $this->url['user'] = $db_info->db_userid;
        $this->url['pass'] = $db_info->db_password;
        $this->url['database'] = $db_info->db_database;
 
        // 데이터베이스 연결
        $this->url['link'] = mysql_connect($this->url['host'], $this->url['user'], $this->url['pass']);
        if (!$this->url['link']) {
            msg('데이터베이스 서버에 연결할 수 없습니다: ' . mysql_error());
            $this->success = false;
            return;
        }
 
        if (!mysql_select_db($this->url['database'], $this->url['link'])) {
            msg('데이터베이스에 연결할 수 없습니다: ' . mysql_error());
            $this->success = false;
            return;
        }
        mysql_query("set names utf8");
 
        // PHP 4때문에 destructor를 명시적 선언
        register_shutdown_function("auth_zbxe_disconnect", $this);
    }
 
    // 패스워드 체크하는 함수
    function checkPass($user, $pass) {
        $query = "select count(*) from ".$this->url['db_prefix']."_member where user_id='$user' and password=MD5('$pass')";
        $result = mysql_query($query);
        if(!$result){
            msg('잘못된 쿼리: ' . mysql_error());
            return false;
        }
        $count = mysql_result($result, 0, 0);
        return ($count == 1 ? true: false);
    }
 
   // 유저 정보를 리턴
   //
   // name : 문자열, 유저이름
   // mail : 문자열, 메일주소
   // grps : 배열, 유저의 그룹 목록
    function getUserData($user) {
        global $conf;
 
        $query = "select user_name, email_address, member_srl from ".$this->url['db_prefix']."_member where user_id='$user'";
        $result = mysql_query($query);
        if(!$result) return null;
 
        if($data = mysql_fetch_array($result)){
            $info['name'] = $data[user_name];
            $info['mail'] = $data[email_address];
            $member_srl = $data[member_srl];
        }
 
        $group_table = $this->url['db_prefix']."_member_group";
        $group_member_table = $this->url['db_prefix']."_member_group_member";
 
        $query = "select g.title as title from ".$group_table." g, ".$group_member_table." gm where g.group_srl = gm.group_srl and gm.member_srl = '$member_srl'";
        $result = mysql_query($query);
 
        if (!$result){
            msg('쿼리 실패: ' . mysql_error());
            return false;
        }
 
        while($data = mysql_fetch_array($result)){
            if(strpos($conf['auth']['zbxe']['user'], $data[title]) !== FALSE){
                $info['grps'][] = 'user';
            }
            if(strpos($conf['auth']['zbxe']['admin'], $data[title]) !== FALSE){
                $info['grps'][] = 'admin';
            }
        }
 
        return $info;
    }
}
 
function auth_zbxe_disconnect($obj) {
    mysql_close($obj->url['link']);
}
 
?>
  • 위 소스를 파일 zbxe.class.php로 저장하여 도쿠위키가 설치된 디렉토리 아래 inc/auth 밑에 복사해 넣는다.
$conf['useacl'] = 1;
$conf['superuser'] = '@admin';  
$conf['authtype'] = 'zbxe';
$conf['auth']['zbxe']['path'] =  "제로보드 설치 전체경로(반드시 /로 끝나야한다)";  (ex : /apache2/xe/)
$conf['auth']['zbxe']['user'] =  "user그룹에 포함될 ZBXE의 그룹명. 여러개는 ;로 구분한다.";    
$conf['auth']['zbxe']['admin'] =  "admin그룹에 포함될 ZBXE의 그룹명. 여러개는 ;로 구분한다.";
$conf['openregister']= 0;
$conf['autopasswd'] = 1;
$conf['resendpasswd']= 0;
  • 위의 인증 백-엔드를 사용하기 위해 도쿠위키가 설치된 디렉토리 아래의 conf/local.php에 위의 내용을 하단에 추가한다.

유의사항

  • 구현은 도쿠위키 ACL의 기본그룹만을 취급하고 있다는 것이다. (소스코드를 좀 더 고치면 커스텀한 그룹을 취급하는 것도 어려운 일은 아니다. 원래 구현은 그런식으로 처리하도록 하려 했는데 한글로 된 그룹명을 도쿠위키 ACL에서 지원하려면 urlencode를 해야하므로 귀차니즘 때문에 간단하게 구현했다) 때문에 'user'로 구분될 유저의 제로보드 그룹을 $conf['auth']['zbxe']['user'] 줄에 넣는데 각 그룹은 ;로 구분한다. 마찬가지로 admin 그룹은 $conf['auth']['zbxe']['admin']에 명시한다.
  • 두번째 주의사항은 명시할 그룹명의 제한사항인데, 그룹명들이 서로 완전히 달라야 한다는 것이다. 위에서 그룹명을 ;로 구분한다고 했는데 귀차니즘 때문에 explode를 해서 각각을 비교하지 않고 그냥 strpos로 검사했기 때문에 문제가 발생될 소지가 있다. 예 를 들면, 제로보드 그룹상에서 '비회원'은 user에 포함되면 안됨에도 불구하고 '예비회원'이라는 그룹이 $conf['auth']['zbxe']['user']안에 포함되어 있으면 '예비회원'이라는 문자열 속에 '비회원'이 포함되어 있으므로 비회원을 user로 처리해버린다.
  • 마지막 주의사항은 도쿠위키에 포함된 local.php는 ANSI로 인코딩되어 있다. 그러나 ANSI 인코딩에 그냥 한글로 된 그룹명을 쓰게 되면 절대 정상작동되지 않으므로 인코딩을 UTF-8(BOM코드가 없어야 한다)로 저장해야만 한다.
  • 소스코드를 고치더라도 local.php를 UTF-8로 인코딩해야 함은 물론이다.
/usr/local/apache/htdocs/data/pages/public/제로보드와_위키위키의_사용자_연동.txt · 마지막 수정: 2009/06/02 11:52 (외부 편집기)
CC Attribution-Noncommercial-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0