지금까지는 아무나 와서 글을 쓸 수 있는 게시판이었다. 하지만 현재 운영되고 있는 대부분의 게시판들은 회원 전용 게시판이다. 글의 목록을 보거나 내용을 보는거는 회원이 아니어도 가능하지만 글을 쓰는 것은 대부분 회원 전용이다.
이전에 했던 글쓰기 화면에 회원만 글을 쓸 수 있도록 수정해보자.
http://localhost:8080/boardWrite
위 페이지로 접근했을때 로그인이 되지 않았다면 로그인 하라는 메세지를 띄우고 로그인 페이지로 이동시켜 보자.
그럼 어떤 파일을 수정해야할까? 바로 콘트롤러다.
/app/Controllers/Board.php
<?php
namespace App\Controllers;
use App\Models\BoardModel;//사용할 모델을 반드시 써줘야한다.
class Board extends BaseController
{
public function list()
{
$db = db_connect();
$query = "select * from board order by bid desc";
$rs = $db->query($query);
$data['list'] = $rs->getResult();//결과값 저장
return render('board_list', $data);//view에 리턴
}
public function write()
{
if(!isset($_SESSION['userid'])){
echo "<script>alert('로그인하십시오.');location.href='/login'</script>";
exit;
}
return render('board_write');
}
public function save()
{
if(!isset($_SESSION['userid'])){
echo "<script>alert('로그인하십시오.');location.href='/login'</script>";
exit;
}
$db = db_connect();
$subject=$this->request->getVar('subject');
$content=$this->request->getVar('content');
$sql="insert into board (userid,subject,content) values ('".$_SESSION['userid']."','".$subject."','".$content."')";
$rs = $db->query($sql);
return $this->response->redirect(site_url('/board'));
}
public function view($bid = null)
{
$db = db_connect();
$query = "select * from board where bid=".$bid;
$rs = $db->query($query);
$data['view'] = $rs->getRow();
return render('board_view', $data);
}
}
write()와 save()에 각각 세션을 확인하는 부분을 만들었다. 세션이 없으면 로그인 페이지로 이동하도록 했다.
로그인 페이지를 만들어보자. 먼저 라우트에 등록한다.
/app/Config/Routes.php
<?php
namespace Config;
// Create a new instance of our RouteCollection class.
$routes = Services::routes();
// Load the system's routing file first, so that the app and ENVIRONMENT
// can override as needed.
if (is_file(SYSTEMPATH . 'Config/Routes.php')) {
require SYSTEMPATH . 'Config/Routes.php';
}
/*
* --------------------------------------------------------------------
* Router Setup
* --------------------------------------------------------------------
*/
$routes->setDefaultNamespace('App\Controllers');
$routes->setDefaultController('Home');
$routes->setDefaultMethod('index');
$routes->setTranslateURIDashes(false);
$routes->set404Override();
// The Auto Routing (Legacy) is very dangerous. It is easy to create vulnerable apps
// where controller filters or CSRF protection are bypassed.
// If you don't want to define all routes, please use the Auto Routing (Improved).
// Set `$autoRoutesImproved` to true in `app/Config/Feature.php` and set the following to true.
// $routes->setAutoRoute(false);
/*
* --------------------------------------------------------------------
* Route Definitions
* --------------------------------------------------------------------
*/
// We get a performance increase by specifying the default
// route since we don't have to scan directories.
$routes->get('/', 'Home::index');
$routes->get('/board', 'Board::list');
$routes->get('/boardWrite', 'Board::write');
$routes->match(['get', 'post'], 'writeSave', 'Board::save');
$routes->get('/boardView/(:num)', 'Board::view/$1');
//member
$routes->get('/login', 'MemberController::login');
$routes->get('/logout', 'MemberController::logout');
$routes->match(['get', 'post'], '/loginok', 'MemberController::loginok');
/*
* --------------------------------------------------------------------
* Additional Routing
* --------------------------------------------------------------------
*
* There will often be times that you need additional routing and you
* need it to be able to override any defaults in this file. Environment
* based routes is one such time. require() additional route files here
* to make that happen.
*
* You will have access to the $routes object within that file without
* needing to reload it.
*/
if (is_file(APPPATH . 'Config/' . ENVIRONMENT . '/Routes.php')) {
require APPPATH . 'Config/' . ENVIRONMENT . '/Routes.php';
}
//member 부분이 추가됐다. 로그인과 로그아웃 로그인처리를 하는 loginok까지 만들어두었다. 이번엔 컨트롤러를 만들어 보자.
/app/Controllers/MemberController.php
<?php
namespace App\Controllers;
use CodeIgniter\Controller;
use App\Models\UserModel;
class MemberController extends BaseController
{
public function login()
{
echo render('login');
}
public function logout()
{
$this->session->destroy();
return redirect()->to('/board');
}
public function loginok()
{
$db = db_connect();
$userid = $this->request->getVar('userid');
$passwd = $this->request->getVar('passwd');
$passwd = hash('sha512',$passwd);
$query = "select * from members where userid='".$userid."' and passwd='".$passwd."'";
//error_log ('['.__FILE__.']['.__FUNCTION__.']['.__LINE__.']['.date("YmdHis").']'.print_r($query,true)."\n", 3, './php_log_'.date("Ymd").'.log');
$rs = $db->query($query);
if($rs){
$ses_data = [
'userid' => $rs->getRow()->userid,
'username' => $rs->getRow()->username,
'email' => $rs->getRow()->email
];
$this->session->set($ses_data);
return redirect()->to('/board');
}else{
return redirect()->to('/login');
}
}
}
이 파일은 새로 만든 파일이다. 또한 logout과 loginok를 모두 만들어 두었다. 설명은 조금이따 하겠다.
로그인 화면을 만들어보자.
/app/Views/login.php
<form class="row g-3 needs-validation" action="<?php echo base_url(); ?>/loginok" method="post">
<div class="col-12">
<label for="validationCustom02" class="form-label">아이디</label>
<input type="text" class="form-control" id="userid" name="userid" placeholder="" required>
</div>
<div class="col-12">
<label for="validationCustom02" class="form-label">비밀번호</label>
<input type="password" class="form-control" id="passwd" name="passwd" placeholder="" required>
</div>
<div class="col-12">
<button class="btn btn-primary" type="submit">로그인</button>
</div>
</form>
이렇게 저장하고 페이지를 띄워보자. 반드시 php spark serve 를 실행하고 해야한다.
http://localhost:8080/board
게시판 메인으로 이동한다. 여기서 등록 버튼을 클릭한다.
로그인 하라는 알럿이 뜨고 위와 같은 로그인 화면으로 이동하면 성공이다. 길이 글어져서 로그인 처리는 다음 시간에 알아보자.