그누보드 최고관리자 추가하기 > 그누보드5 팁자료실

그누보드5 팁자료실

그누보드 최고관리자 추가하기 정보

그누보드 최고관리자 추가하기

본문

그누보드 최고관리자 추가하는 기능입니다.

GPT시켜서 만들긴했습니다만, 쓸만하게 나온거같아서 공유해봅니다.

일단 ai 사용규정에 대해서 찾아봤는데, 따로 제한은 안보이고, ai게시판은 정말 ai 사용기가 메인인거같아서 여기에 올려봅니다. 문제시 삭제하겠습니다.

일단 DB에 별도로 저장하는 방식을 사용하기때문에 DB에 테이블 추가가 필요합니다.

 

(InnoDB 기준 코드입니다. 그 외는 수정해서 사용하세요.)

CREATE TABLE IF NOT EXISTS `g5_multi_super` (
  `ms_id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
  `mb_id` VARCHAR(20) NOT NULL,
  PRIMARY KEY (`ms_id`),
  UNIQUE KEY `uk_mb_id` (`mb_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

 

/extend/multi_super.extend.php (생성)

<?php
if (!defined('_GNUBOARD_')) exit;

// 테이블명 결정
$__tbl_multi = isset($g5['multi_super_table'])
  ? $g5['multi_super_table']
  : (defined('G5_TABLE_PREFIX') ? G5_TABLE_PREFIX.'multi_super' : 'g5_multi_super');

if (!empty($member['mb_id'])) {
    // 현재 로그인 사용자가 추가 슈퍼 목록에 있으면 슈퍼로 승격
    $row = sql_fetch("SELECT 1 FROM {$__tbl_multi} WHERE mb_id = '".sql_real_escape_string($member['mb_id'])."' LIMIT 1", false);
    if (isset($row[1]) || isset($row['1'])) {
        $is_admin = 'super';
    }
}
 

 

/adm/multi_super.php (생성)

<?php
// /adm/multi_super.php
include_once('./_common.php');

$sub_menu = '100110'; // 임의 코드, 메뉴 권한체크용
auth_check_menu($auth, $sub_menu, 'r'); // 읽기 권한
$g5['title'] = '최고관리자 다중설정';

// 원래 최고관리자만 접근
if (!isset($member['mb_id']) || $member['mb_id'] !== $config['cf_admin']) alert('원래 최고관리자만 접근 가능합니다.');

// 테이블명
$tbl = isset($g5['multi_super_table']) ? $g5['multi_super_table'] : (defined('G5_TABLE_PREFIX') ? G5_TABLE_PREFIX.'multi_super' : 'g5_multi_super');

// 현재 목록 읽기
$list = array();
$q = sql_query("SELECT mb_id FROM {$tbl} ORDER BY mb_id ASC", false);
while ($r = sql_fetch_array($q)) {
    if (!empty($r['mb_id'])) $list[] = $r['mb_id'];
}
$cur = implode(',', $list);

$g5_title = '멀티 최고관리자 설정';
include_once('./admin.head.php');
?>
<div class="local_desc01 local_desc">
  <p>추가 슈퍼관리자 아이디를 콤마(,)로 구분해 입력/편집하세요.</p>
  <p>※ 원래 최고관리자(<?php echo get_text($config['cf_admin']); ?>)만 수정 가능</p>
</div>

<form method="post" action="./multi_super_update.php" autocomplete="off">
  <input type="hidden" name="token" value="<?php echo get_admin_token(); ?>">
  <div class="tbl_frm01 tbl_wrap">
    <table>
      <colgroup><col class="grid_2"><col></colgroup>
      <tbody>
        <tr>
          <th scope="row">추가 슈퍼관리자</th>
          <td>
            <input type="text" name="cf_multi_super" value="<?php echo get_sanitize_input($cur); ?>" class="frm_input" style="width:100%;">
            <div class="frm_info">존재하는 회원만 저장됩니다. 공백은 자동 제거됩니다.</div>
          </td>
        </tr>
      </tbody>
    </table>
  </div>
  <div class="btn_fixed_top">
    <input type="submit" value="저장" class="btn_submit btn" accesskey="s">
  </div>
</form>
<?php include_once('./admin.tail.php'); ?>

 

/adm/multi_super_update.php(생성)

<?php
include_once('./_common.php');

// 원래 최고관리자만 저장 허용
if (!isset($member['mb_id']) || $member['mb_id'] !== $config['cf_admin']) alert('원래 최고관리자만 접근 가능합니다.');
check_admin_token();

// 테이블명
$tbl = isset($g5['multi_super_table']) ? $g5['multi_super_table'] : (defined('G5_TABLE_PREFIX') ? G5_TABLE_PREFIX.'multi_super' : 'g5_multi_super');

// 입력 파싱
$raw = isset($_POST['cf_multi_super']) ? (string)$_POST['cf_multi_super'] : '';
$items = array();
foreach (explode(',', $raw) as $id) {
    $id = trim($id);
    if ($id === '') continue;
    $mb = get_member($id);
    if (!is_array($mb) || empty($mb['mb_id'])) continue;
    $items[] = $mb['mb_id'];
}
$items = array_values(array_unique($items));

// 트랜잭션 (없어도 되지만 안전하게)
sql_query("START TRANSACTION");
sql_query("DELETE FROM {$tbl}"); // 전량 교체 방식
foreach ($items as $id) {
    sql_query("INSERT INTO {$tbl} (mb_id) VALUES ('".sql_real_escape_string($id)."')");
}
sql_query("COMMIT");

alert('저장되었습니다.', './multi_super.php');
 

/adm/admin.menu100.php (수정)

4번 라인밑에다가 한줄삽입

array('100110', '최고관리자 다중설정', G5_ADMIN_URL . '/multi_super.php',   'cf_multi_super'),

 

이렇게 하면 아래처럼 관리자페이지에 메뉴가 추가되며, 콤마를 넣어서 최고관리자를 여러명 넣을수있습니다.2038537583_1757021253.8773.png

기본환경설정에서 지정한 최고관리자만 해당 페이지에 접근할수있고, 여기에서 추가된 최고관리자는 이 페이지 접속만 제한되고, 나머지에서는 정상적으로 최고관리자로 인식됩니다.

문제있으면 알려주시면 감사하겠습니다.

 

=======추가=======

기본환경설정에서 설정된 최고관리자를 추가로등록한 최고관리자가 변경 못하도록 막으려면 config_form.php에서 해당부분을 다음 코드로 바꿔주면 됩니다.

<tr>
    <th scope="row"><label for="cf_admin">최고관리자<strong class="sound_only">필수</strong></label></th>
    <td colspan="3"><?php echo get_member_id_select('cf_admin', 10, $config['cf_admin'], 'required') ?></td>
</tr>

이 코드를 지우고 아래코드로 바꿔주세요.

<?php
                    $is_root_super = (isset($member['mb_id']) && $member['mb_id'] === $config['cf_admin']);
                    $cur_cf_admin  = $config['cf_admin'];
                    ?>
                    <tr>
                        <th scope="row"><label for="cf_admin">최고관리자<strong class="sound_only">필수</strong></label></th>
                        <td colspan="3">
                            <?php if ($is_root_super) { ?>
                                <!-- 원래 최고관리자 본인만 셀렉트 박스 노출 -->
                                <?php echo get_member_id_select('cf_admin', 10, $cur_cf_admin, 'required'); ?>
                                <div class="frm_info">※ 현재 로그인한 계정이 원래 최고관리자일 때만 변경 가능합니다.</div>
                            <?php } else { ?>
                                <!-- 다른 슈퍼/관리자는 읽기 전용 -->
                                <input type="hidden" name="cf_admin" value="<?php echo get_sanitize_input($cur_cf_admin); ?>">
                                <span class="frm_info"><?php echo get_text($cur_cf_admin); ?> (읽기 전용)</span>
                            <?php } ?>
                        </td>
                    </tr>

 

만약을 대비해서 백그라운드에 보호로직 추가하실거면 config_form_update.php에 check_admin_token(); 밑에 다음 코드를 추가하시면 됩니다.

 

$__root_only = (isset($member['mb_id']) && isset($config['cf_admin']) && $member['mb_id'] === $config['cf_admin']);

if (!$__root_only && isset($_POST['cf_admin'])) {
    // 폼 위변조 대비: 원래 값으로 강제 고정
    $_POST['cf_admin'] = $config['cf_admin'];
}

 

적용하면 추가된 최고관리자는 이렇게 나옵니다.

2038537583_1757056756.479.png

추천
2
  • 복사

댓글 5개

 너무 남발하면 더 힘들어지긴 하겠지만, 그누보드가 권한부여 메뉴로 부여 가능한 권한이 너무 한정적이어서 있으면 좋겠다 생각했습니다.
아 그리고 기본환경설정에서 설정된 최고관리자를 추가로등록한 최고관리자가 변경 못하도록 막으려면 config_form.php에서 해당부분을 다음 코드로 바꿔주면 됩니다.

<tr>
    <th scope="row"><label for="cf_admin">최고관리자<strong class="sound_only">필수</strong></label></th>
    <td colspan="3"><?php echo get_member_id_select('cf_admin', 10, $config['cf_admin'], 'required') ?></td>
</tr>

이 코드를 지우고 아래코드로 바꿔주세요.

<?php
                    $is_root_super = (isset($member['mb_id']) && $member['mb_id'] === $config['cf_admin']);
                    $cur_cf_admin  = $config['cf_admin'];
                    ?>
                    <tr>
                        <th scope="row"><label for="cf_admin">최고관리자<strong class="sound_only">필수</strong></label></th>
                        <td colspan="3">
                            <?php if ($is_root_super) { ?>
                                <!-- 원래 최고관리자 본인만 셀렉트 박스 노출 -->
                                <?php echo get_member_id_select('cf_admin', 10, $cur_cf_admin, 'required'); ?>
                                <div class="frm_info">※ 현재 로그인한 계정이 원래 최고관리자일 때만 변경 가능합니다.</div>
                            <?php } else { ?>
                                <!-- 다른 슈퍼/관리자는 읽기 전용 -->
                                <input type="hidden" name="cf_admin" value="<?php echo get_sanitize_input($cur_cf_admin); ?>">
                                <span class="frm_info"><?php echo get_text($cur_cf_admin); ?> (읽기 전용)</span>
                            <?php } ?>
                        </td>
                    </tr>

 

만약을 대비해서 백그라운드에 보호로직 추가하실거면 config_form_update.php에 check_admin_token(); 밑에 다음 코드를 추가하시면 됩니다.

 

$__root_only = (isset($member['mb_id']) && isset($config['cf_admin']) && $member['mb_id'] === $config['cf_admin']);

if (!$__root_only && isset($_POST['cf_admin'])) {
    // 폼 위변조 대비: 원래 값으로 강제 고정
    $_POST['cf_admin'] = $config['cf_admin'];
}

© SIRSOFT
현재 페이지 제일 처음으로