반응형

지난 시간에 마지막에 본 로그인 화면이다. 여기서 아이디와 비밀번호를 넣고 로그인버튼을 누르면 로그인이 되도록 처리해보자. php 해본 사람들은 로그인이 되도록 처리하는게 무엇인지 알것이다. 바로 세션값을 주는 것이다. 시작해보자.

 

우선 위 화면에서 로그인을 버튼을 눌렀을때 이동하는 페이지를 확인해보자. 항상 라우트부터 시작한다.

 

/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';
}

$routes->match(['get', 'post'], '/loginok', 'MemberController::loginok');

 

이 부분이다. get이나 post로 보내주면 그 값을 받아서 MemberController에 있는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');
        }
    }
}

loginok 부분을 잘보자. 사용자가 입력한 아이디와 비밀번호를 디비에 조회해보고 해당 사용자가 맞으면 세션에 데이터를 저장하는 방법으로 로그인 처리를 한다. 다음부터 해당 세션에 값이 있으면 로그인 한것이고 없으면 안한것이다.

 

그런데 세션을 처리해 주려면 한가지 해줄게 더 있다. 세션을 선언해주어야한다. 전에 우리가 했던 일반 php에서는 session_start()라는걸 해줬다. 모든 페이지에 인클루드 시켜서 세션값을 체크하곤했다. CI4에서는 그렇게 안한다.

 

아래 파일을 열어보자.

 

/app/Controllers/BaseController.php

<?php

namespace App\Controllers;

use CodeIgniter\Controller;
use CodeIgniter\HTTP\CLIRequest;
use CodeIgniter\HTTP\IncomingRequest;
use CodeIgniter\HTTP\RequestInterface;
use CodeIgniter\HTTP\ResponseInterface;
use Psr\Log\LoggerInterface;

/**
 * Class BaseController
 *
 * BaseController provides a convenient place for loading components
 * and performing functions that are needed by all your controllers.
 * Extend this class in any new controllers:
 *     class Home extends BaseController
 *
 * For security be sure to declare any new methods as protected or private.
 */
abstract class BaseController extends Controller
{
    /**
     * Instance of the main Request object.
     *
     * @var CLIRequest|IncomingRequest
     */
    protected $request;

    /**
     * An array of helpers to be loaded automatically upon
     * class instantiation. These helpers will be available
     * to all other controllers that extend BaseController.
     *
     * @var array
     */
    protected $helpers = [];

    /**
     * Constructor.
     */
    public function initController(RequestInterface $request, ResponseInterface $response, LoggerInterface $logger)
    {
        // Do Not Edit This Line
        parent::initController($request, $response, $logger);

        // Preload any models, libraries, etc, here.

        // E.g.: $this->session = \Config\Services::session();
        $this->session = \Config\Services::session();
    }
}

맨 아랫부분에 $this->session = \Config\Services::session(); 세션을 선언하는 부분을 만들었다. 그리고 이제 컨트롤러를 만들때 상속받을 부모를 선언할때 이 BaseController를 선언해주면 된다.

 

화면을 위로 올려서 아까만든 /app/Controllers/MemberController.php 이 파일을 확인해보자. 파일의 상단부분에 

class MemberController extends BaseController

이렇게 상속받을 부모 콘트롤러에 BaseController를 입력해 주었다. 이 파일뿐만아니라 /app/Controllers/Board.php 이 파일도 마찬가지이며 앞으로 새로 만들 모든 컨트롤러들은 같은 방식으로 만들 것이다.

 

자 이제 로그인을 해보자.

 

http://localhost:8080/login

 

 

 

반응형

+ Recent posts