특정 게시판을 관리자가 설정한 비밀번호로 접근 제한하기 정보
특정 게시판을 관리자가 설정한 비밀번호로 접근 제한하기본문
이 글은 관리자가 설정한 특별한 코드를 입력해야만 사용자가 특정 게시판에 접근할 수 있도록 하는 방법에 대해 설명합니다. 이 방법은 일반적인 게시물의 비밀글 기능과는 달리 특정 게시판의 전체 리스트, 내용 보기, 글쓰기 등에 적용됩니다. 코드를 변경하면, 이전에 접근 가능했던 사용자들도 다시 코드를 입력해야 접근할 수 있으므로, 변경된 코드를 사용자들에게 재공지 해야 합니다.
구현 방법 요약:
- 사용자가 게시판에 접근하려고 할 때, 해당 사용자가 코드를 이미 입력했는지 확인하기 위해 세션을 검사합니다.
- 사용자가 코드를 입력하지 않았거나 세션 기록이 없다면, 코드 입력 화면이 표시됩니다.
- 사용자가 코드를 입력하거나 세션 기록이 있다면, 게시판에 접근이 허용됩니다.
- 사용자의 브라우저가 종료되거나 일정 시간 동안 활동이 없다면, 세션이 삭제됩니다.
- 최고 관리자의 경우 세션에 대한 검사를 수행하지 않습니다. (관리자 프리패스)
구현 내용:
1. 게시판 접근 암호 설정
- 관리자 페이지 > 게시판 관리 > 게시판 설정 > 여분필드 1 값
게시판에 접근할 수 있는 암호 코드를 게시판 여분필드 1 값에 입력합니다.
아래의 구현한 스크립트에서는 영문(대소문자 구분)과 숫자로 이루어져 있는지 검사하도록 되어있습니다.
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
8
댓글 11개
감사합니다
@DawnDew 댓글주셔서 감사합니다!
감사합니다.
갑자기 생각나서 질문드립니다.
혹시 게시물마다 관리자가 비번 걸어서...그 비번 아는 사람만 해당 게시물을 볼수 있게 할수도 있을까요?
관리자로 로그인하면 게시물 보기하면 비번넣기가 없으니..설정할수가 없는데..
관리자가 게시물 마다 비번을 다르게 설정할 수 있으면 활용도가 좀 있지 않을까란 생각이 드네요..^^
갑자기 생각나서 질문드립니다.
혹시 게시물마다 관리자가 비번 걸어서...그 비번 아는 사람만 해당 게시물을 볼수 있게 할수도 있을까요?
관리자로 로그인하면 게시물 보기하면 비번넣기가 없으니..설정할수가 없는데..
관리자가 게시물 마다 비번을 다르게 설정할 수 있으면 활용도가 좀 있지 않을까란 생각이 드네요..^^
@호텔천사 비밀번호가 아니라 관리자가 글을 작성할 때 wr_1 등 여분 필드에 문자열을 입력하도록 해두고서 같은 방법으로 글의 view 페이지에서만 이게 적용되도록 구현하면 될 것 같습니다!
이런 방법이 있었군요. 감사합니다. ^^
@민트다이어리 관심가져 주셔서 감사합니다~!
좋은 팁 공유 감사드립니다. 추천꾹!
@marty72 감사합니다.
감사합니다
감사합니다~~
유용한 팁 감사합니다