그누보드 API 관련 개발내용 TIP 정보
그누보드 API 관련 개발내용 TIP본문
API는 로그인한 사용자, 또는 비로그인한 사용자에 따라서 다르게 보여줘야합니다.
관리자가 아니라면 $config 변수의 키값들이라던가, 각각의 게시글 또는 회원의 패스워드를 노출하지 않아야 하고,
그 외의 접근권한이 없는 회원들에게는 아예 노출해야 하지 않아야 하는 경우도 있습니다.
그누보드내에서 이러한 해당 권한 변수 중 가장 대표적인게
$is_admin, $is_guest, $is_member, $member 인데
해당 부분은 매 api 접근시마다 체크해주시는게 좋습니다.
php를 예로 들면
public function __construct() {
public $g5;
public $dsn = "mysql:host=".G5_MYSQL_HOST.";port=3306;dbname=".G5_MYSQL_DB.";charset=utf8";
public $db;
public $is_member = false;
public $is_guest = false;
public $is_admin = '';
public $board = array();
public $config = array();
public $group = array();
public $member = array();
private $key = 'haskdlfjoieqimfqeif';
private $cookiename = 'gnu_jwt';
public function __construct() {
try {
$this->db = new PDO($this->dsn, G5_MYSQL_USER, G5_MYSQL_PASSWORD);
$this->db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$this->init();
} catch(PDOException $e) {
echo $this->msg('DB 연결에 실패하였습니다');
$e->getMessage();
}
}
public function sql_query($query, $condition=array()) {
try {
$stmt = $this->db->prepare($query);
if($condition) $stmt->execute($condition);
else $stmt->execute();
$result = $stmt->fetchAll(PDO::FETCH_ASSOC);
return $result;
} catch(PDOException $e) {
return $e->getMessage();
}
}
public function sql_fetch($query, $condition=array()) {
try {
$stmt = $this->db->prepare($query);
if($condition) $stmt->execute($condition);
else $stmt->execute();
return $stmt->fetch(PDO::FETCH_ASSOC);
} catch(PDOException $e) {
return $e->getMessage();
}
}
// 관리자인가?
public function is_admin($mb_id) {
if (!$mb_id) return '';
$is_authority = '';
if ($this->config['cf_admin'] == $mb_id){
$is_authority = 'super';
} else if (isset($this->$group['gr_admin']) && ($this->$group['gr_admin'] == $mb_id)){
$is_authority = 'group';
} else if (isset($this->$board['bo_admin']) && ($this->$board['bo_admin'] == $mb_id)){
$is_authority = 'board';
}
return $is_authority;
}
//권한체크
public function init() {
global $g5;
$config = $this->sql_fetch("SELECT * FROM {$g5['config_table']}"); //그누보드 설정
if(isset($_COOKIE[$this->cookiename])) {
$decoded = JWT::decode($_COOKIE[$this->cookiename], $this->key, array('HS256')); //로그인 여부
$mb_id = $decoded->aud;
$this->member = $this->sql_fetch("SELECT * FROM {$g5['member_table']} WHERE mb_id = ?", [$mb_id]); //회원정보 설정
$this->is_admin = $this->is_admin($member['mb_id']);
$this->is_member = true;
$this->is_guest = false;
}else {
$this->is_guest = true;
$this->is_admin = false;
$this->is_member = false;
$this->member['mb_id'] = '';
$this->member['mb_level'] = 1; // 비회원의 경우 회원레벨을 가장 낮게 설정
}
}
로 해당 api 접근시 기본적인 권한에 대해 가져오고 있습니다.
아래의 글과 함께 php로 개발중인데, 아무래도 데이터를 가져오고 출력하는 부분보다
그누보드 bbs/board.php, common.php 등 다양한 페이지에서 접근 권한 체크를 하고 있기 때문에 해당 부분과 동일한 접근 호출을 하는 api는 해당 페이지를 참조하여 권한 체크를 해주어야 합니다.
특히 is_member, is_guest, is_admin, member등은 거의 모든 페이지에서 권한 체크가 이루어지기 때문에 해당 부분은 아예 클래스내에서 전역변수처럼 활용가능하게 선언하여 사용하는것이 편합니다.
추후 어느정도 기개발 되면 깃헙에 해당 소스 전체는 공개하도록 하겠습니다.
!-->
공감
0
0
댓글 4개
PHP로 Rest라서 기대 됩니다. 어느정도 다큐먼트를 해 놔야 그것을 가지고 서로 프로그램하기가 편해질 것 같습니다.
토큰에 유저정보와 시간정도 넣어서 게시판 보드별 레벨 컨트롤하면 될 것 같습니다. 어드민 레벨도 별도로 관리되고..
토큰에 유저정보와 시간정도 넣어서 게시판 보드별 레벨 컨트롤하면 될 것 같습니다. 어드민 레벨도 별도로 관리되고..
@볼피드 개념적으로 GET만 적어봤습니다. POST(쓰기), PUT(update), DELETE 로 작성할 예정입니다.
당연히 파일 업로드도 되어야죠..
https://docker.apachezone.com/blog/149 입출력 포맷도 중요한 것 같습니다.
어떤식으로 이것이 정해 지느냐에 따라 프런트엔드 단에서 프로그램하기가 편하겠죠.
주고 받는 포맷도 JSONP라는 것도 있고.. 거기에 들어가는 각 키 밸류도 잘 정해 놓으면 여러모로 필요할 것 같은데, 하여간 어렵네요
당연히 파일 업로드도 되어야죠..
https://docker.apachezone.com/blog/149 입출력 포맷도 중요한 것 같습니다.
어떤식으로 이것이 정해 지느냐에 따라 프런트엔드 단에서 프로그램하기가 편하겠죠.
주고 받는 포맷도 JSONP라는 것도 있고.. 거기에 들어가는 각 키 밸류도 잘 정해 놓으면 여러모로 필요할 것 같은데, 하여간 어렵네요
여기서 대단한걸 하시고 있군여 볼피드님!