특정 게시판을 관리자가 설정한 비밀번호로 접근 제한하기 > 그누보드5 팁자료실

그누보드5 팁자료실

특정 게시판을 관리자가 설정한 비밀번호로 접근 제한하기 정보

특정 게시판을 관리자가 설정한 비밀번호로 접근 제한하기

본문

이 글은 관리자가 설정한 특별한 코드를 입력해야만 사용자가 특정 게시판에 접근할 수 있도록 하는 방법에 대해 설명합니다. 이 방법은 일반적인 게시물의 비밀글 기능과는 달리 특정 게시판의 전체 리스트, 내용 보기, 글쓰기 등에 적용됩니다. 코드를 변경하면, 이전에 접근 가능했던 사용자들도 다시 코드를 입력해야 접근할 수 있으므로, 변경된 코드를 사용자들에게 재공지 해야 합니다.
 

구현 방법 요약:

  1. 사용자가 게시판에 접근하려고 할 때, 해당 사용자가 코드를 이미 입력했는지 확인하기 위해 세션을 검사합니다.
  2. 사용자가 코드를 입력하지 않았거나 세션 기록이 없다면, 코드 입력 화면이 표시됩니다.
  3. 사용자가 코드를 입력하거나 세션 기록이 있다면, 게시판에 접근이 허용됩니다.
  4. 사용자의 브라우저가 종료되거나 일정 시간 동안 활동이 없다면, 세션이 삭제됩니다.
  5. 최고 관리자의 경우 세션에 대한 검사를 수행하지 않습니다. (관리자 프리패스)


구현 내용:

1. 게시판 접근 암호 설정
- 관리자 페이지 > 게시판 관리 > 게시판 설정 > 여분필드 1 값
게시판에 접근할 수 있는 암호 코드를 게시판 여분필드 1 값에 입력합니다.
아래의 구현한 스크립트에서는 영문(대소문자 구분)과 숫자로 이루어져 있는지 검사하도록 되어있습니다.
238457627_1693898038.9445.jpg

 

2. 세션 시작 및 게시판 접근 시 코드 확인 로직 시작:

- 파일: bbs/board.php


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

파일의 최상단 위의 코드를 찾아 그 아래에 다음에 올 코드를 적용합니다.

session_start();
function convertToSeconds($hours, $minutes, $seconds) {
    return ($hours * 3600) + ($minutes * 60) + $seconds;
}
$accessCode = $board['bo_1'];  // 관리자가 설정한 접근 코드, 게시판 설정 여분
$boardId = 'promotion';  // 특정 게시판의 bo_table ID, 예제에서는 promotion 게시판
$sessionDuration = convertToSeconds(0, 10, 0); // 세션 유지시간 (시간, 분, 초), 예제에서는 10분
if ($bo_table == $boardId) {
    if ($is_admin === 'super') {
        // 최고 관리자는 바로 접근 가능
    } else {
        if ($_SERVER['REQUEST_METHOD'] == 'POST' && isset($_POST['code']) && $accessCode !== '') {
            if ($_POST['code'] === $accessCode) {
                $_SESSION['board_access'] = time();
                // 세션 만료 시간 설정
                $_SESSION['session_expire'] = time() + $sessionDuration;
                header("Location: " . G5_URL.'/'.$bo_table); // 세션 만료시 리다이렉트 되는 URL
                exit;
            } else {
                alert('코드가 일치하지 않습니다.');
            }
        }
        if (isset($_SESSION['session_expire'])) {
            if (time() > $_SESSION['session_expire']) {
                // 세션 종료
                unset($_SESSION['board_access']);
                unset($_SESSION['session_expire']);
                echo "<script>alert('세션이 만료되었습니다. 다시 코드를 입력해주세요.');</script>";
                include_once(G5_BBS_PATH.'/code_check.php'); // 코드 입력 폼
                exit;
            }
        } else {
            include_once(G5_BBS_PATH.'/code_check.php'); // 코드 입력 폼
            exit;
        }
    }
}


3. bbs/board.php에서 include()로 가져올 입력폼 생성 및 작성
- 파일: bbs/code_check.php (각자의 웹사이트에 맞도록 디자인해서 사용하시면 됩니다.)

<?php
if (!defined('_GNUBOARD_')) exit; // 개별 페이지 접근 불가
include_once(G5_PATH.'/head.php');
?>
<form name="promotion_code" action="<?php echo G5_URL; ?>/promotion" onsubmit="return code_submit(this);" method="post">
    <fieldset>
        <legend>프로모션 코드 입력</legend>
        <label for="code">접근코드</label>
        <input type="text" name="code" id="code" required class="required" placeholder="코드" oninput="return restrictInput(this, event)">
        <button type="submit">입력하기</button>
    </fieldset>
</form>
 <script>
    function restrictInput(input, event) {
            var value = input.value;
            input.value = value.replace(/[^a-zA-Z0-9]/g, '');
    }
    function code_submit(f) {
        var code = f.code.value;
        // 코드가 비어있는지 확인
        if (code == "") {
            alert("코드를 입력해주세요.");
            f.code.focus();
            return false;
        }
        // 코드가 영문자(대소문자 구분), 숫자만 포함하는지 확인
        var validCharacters = /^[a-zA-Z0-9]+$/;
        if (!validCharacters.test(code)) {
            alert("코드는 영문자(대소문자 구분)과 숫자만 포함할 수 있습니다.");
            f.code.focus();
            return false;
        }
        return true;
    }
  </script>
<?php include_once(G5_PATH.'/tail.php');


이렇게 설정하면, 특정 게시판에 접근하려고 하면 세션을 검사하고, 생성된 세션이 없다면 코드 입력 폼을 include 하여 코드를 입력하도록 합니다. 코드를 올바르게 입력하면 세션을 생성하고, 해당 게시판의 활동이 설정한 시간 동안 유지됩니다. 설정된 시간 동안 활동이 없거나, 브라우저를 종료하면 세션이 만료되어 사라지고, 이후 다시 접근하려면 코드를 다시 입력해야 합니다.

 

제 프로젝트에 적용한 내용을 재작성한 것이기 때문에 오류가 발생할 수 있습니다.

오류가 있을 경우 알려주시면 감사하겠습니다.

추천
8

댓글 10개

감사합니다.

갑자기 생각나서 질문드립니다.
혹시 게시물마다 관리자가 비번 걸어서...그 비번 아는 사람만 해당 게시물을 볼수 있게 할수도 있을까요?

관리자로 로그인하면 게시물 보기하면 비번넣기가 없으니..설정할수가 없는데..
관리자가 게시물 마다 비번을 다르게 설정할 수 있으면 활용도가 좀 있지 않을까란 생각이 드네요..^^
비밀번호가 아니라 관리자가 글을 작성할 때 wr_1 등 여분 필드에 문자열을 입력하도록 해두고서 같은 방법으로 글의 view 페이지에서만 이게 적용되도록 구현하면 될 것 같습니다!
전체 2,432 |RSS
그누보드5 팁자료실 내용 검색

회원로그인

(주)에스아이알소프트 / 대표:홍석명 / (06211) 서울특별시 강남구 역삼동 707-34 한신인터밸리24 서관 1404호 / E-Mail: admin@sir.kr
사업자등록번호: 217-81-36347 / 통신판매업신고번호:2014-서울강남-02098호 / 개인정보보호책임자:김민섭(minsup@sir.kr)
© SIRSOFT