반응형

지금까지는 아무나 와서 글을 쓸 수 있는 게시판이었다. 하지만 현재 운영되고 있는 대부분의 게시판들은 회원 전용 게시판이다. 글의 목록을 보거나 내용을 보는거는 회원이 아니어도 가능하지만 글을 쓰는 것은 대부분 회원 전용이다.

 

이전에 했던 글쓰기 화면에 회원만 글을 쓸 수 있도록 수정해보자.

 

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

 

게시판 메인으로 이동한다. 여기서 등록 버튼을 클릭한다.

 

로그인 하라는 알럿이 뜨고 위와 같은 로그인 화면으로 이동하면 성공이다. 길이 글어져서 로그인 처리는 다음 시간에 알아보자.

반응형

+ Recent posts