ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [CodeIgniter] 7. 사용자 인증(로그인)
    Web/CodeIgniter 2015. 8. 25. 19:53

    7장에서는 로그인에 관한 처리를 해보겠습니다. 거의 모든 사이트에서 중요한 부분이 회원가입 후의 사용자 인증 부분입니다.


    사이트의 첫 시작이라고 해도 과언이 아닙니다. 사이트 개발 시 제일 먼저 하는 작업이 가입, 로그인, 회원 관리입니다.






    7.1 세션 구조

     CodeIgniter의 세션 라이브러리는 PHP의 세션과 작동 형태가 조금 다릅니다. 세션이 생성되는 것은 동일한데 실제 사용자 데이터는 쿠키에 담깁니다.



     






     이렇게 복잡하게 구성된 이유는 사용자 데이터 보안이 강화된 데이터베이스 세션을 구현하기 위해서입니다.


     CodeIgniter의 데이터베이스 세션은 위 그림의 1, 2번 절차는 동일하고 3번의 사용자 데이터가 저장되는 곳이 데이터베이스로 바뀝니다. 그렇게 되면 해커나 사용자가 PC의 쿠키를 볼수 없기 때문에 보안 측면이 강화됩니다. 


     일반적인 경우 쿠키를 암호화하여 저장하지 않아서 쿠키 파일을 열어보면 사용자 아이디, 이름, 전화번호 등을 볼 수 있습니다.


     무조건 데이터베이스 세션을 사용할 필요는 없지만 보안 강화를 위해 서버 자원을 조금 더 사용하더라도 사용하는 것이 좋습니다.




     먼저, 데이터베이스 세션을 사용하기 위해 설정을 바꿔줍니다.


     * bbs/application/config/config.php


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    <?php
    /*
    |--------------------------------------------------------------------------
    | Session Variables
    |--------------------------------------------------------------------------
    |
    | 'sess_cookie_name'        = the name you want for the cookie
    | 'sess_expiration'            = the number of SECONDS you want the session to last.
    |   by default sessions last 7200 seconds (two hours).  Set to zero for no expiration.
    | 'sess_expire_on_close'    = Whether to cause the session to expire automatically
    |   when the browser window is closed
    | 'sess_encrypt_cookie'        = Whether to encrypt the cookie
    | 'sess_use_database'        = Whether to save the session data to a database
    | 'sess_table_name'            = The name of the session database table
    | 'sess_match_ip'            = Whether to match the user's IP address when reading the session data
    | 'sess_match_useragent'    = Whether to match the User Agent when reading the session data
    | 'sess_time_to_update'        = how many seconds between CI refreshing Session Information
    |
    */
    $config['sess_cookie_name']        = 'ci_session';
    $config['sess_expiration']        = 7200;
    $config['sess_expire_on_close']    = FALSE;
    $config['sess_encrypt_cookie']    = FALSE;
    $config['sess_use_database']    = TRUE;
    $config['sess_table_name']        = 'ci_sessions';
    $config['sess_match_ip']        = FALSE;
    $config['sess_match_useragent']    = TRUE;
    $config['sess_time_to_update']    = 300;
     
     
    cs




     config.php의 Session 부분을 찾아서 아래와 같이 수정해 줍니다.


     다음으로 Encrypt key 설정이 필요합니다. config.php 에서 아래 부분을 찾아서 수정합니다.


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <?
    /*
    |--------------------------------------------------------------------------
    | Encryption Key
    |--------------------------------------------------------------------------
    |
    | If you use the Encryption class or the Session class you
    | MUST set an encryption key.  See the user guide for info.
    |
    */
    $config['encryption_key'= 'bbs_system';
     
    cs






     


     다음은 MySQL ci_book DB에 ci_sessions 테이블을 생성해야 합니다. MySQL 콘솔에 접속하여 테이블을 생성합니다.






     ci_sessions 테이블 생성


     use ci_book;


     CREATE TABLE IF NOT EXISTS ci_sessions (

    session_id varchar(40) DEFAULT 0 NOT NULL PRIMARY KEY,

    ip_address varchar(40) DEFAULT 0 NOT NULL,

    user_agent varchar(120) NOT NULL,

    last_activity int(10) unsigned DEFAULT 0 NOT NULL,

    user_data text NOT NULL,

    KEY last_activity_idx (last_activity)

     );







     그리고 세션과 데이터베이스를 계속 이용해 프로그램을 할 것이라 이 라이브러리를 자동 로드하도록 하겠습니다.



     * bbs/application/config/autoload.php


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
     
    <?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
    /*
    | -------------------------------------------------------------------
    | AUTO-LOADER
    | -------------------------------------------------------------------
    | This file specifies which systems should be loaded by default.
    |
    | In order to keep the framework as light-weight as possible only the
    | absolute minimal resources are loaded by default. For example,
    | the database is not connected to automatically since no assumption
    | is made regarding whether you intend to use it.  This file lets
    | you globally define which systems you would like loaded with every
    | request.
    |
    | -------------------------------------------------------------------
    | Instructions
    | -------------------------------------------------------------------
    |
    | These are the things you can load automatically:
    |
    | 1. Packages
    | 2. Libraries
    | 3. Helper files
    | 4. Custom config files
    | 5. Language files
    | 6. Models
    |
    */
     
    /*
    | -------------------------------------------------------------------
    |  Auto-load Packges
    | -------------------------------------------------------------------
    | Prototype:
    |
    |  $autoload['packages'] = array(APPPATH.'third_party', '/usr/local/shared');
    |
    */
     
    $autoload['packages'= array();
     
     
    /*
    | -------------------------------------------------------------------
    |  Auto-load Libraries
    | -------------------------------------------------------------------
    | These are the classes located in the system/libraries folder
    | or in your application/libraries folder.
    |
    | Prototype:
    |
    |    $autoload['libraries'] = array('database', 'session', 'xmlrpc');
    */
     
    $autoload['libraries'= array('database''session');
     
     
    /*
    | -------------------------------------------------------------------
    |  Auto-load Helper Files
    | -------------------------------------------------------------------
    | Prototype:
    |
    |    $autoload['helper'] = array('url', 'file');
    */
     
    $autoload['helper'= array();
     
     
    /*
    | -------------------------------------------------------------------
    |  Auto-load Config files
    | -------------------------------------------------------------------
    | Prototype:
    |
    |    $autoload['config'] = array('config1', 'config2');
    |
    | NOTE: This item is intended for use ONLY if you have created custom
    | config files.  Otherwise, leave it blank.
    |
    */
     
    $autoload['config'= array();
     
     
    /*
    | -------------------------------------------------------------------
    |  Auto-load Language files
    | -------------------------------------------------------------------
    | Prototype:
    |
    |    $autoload['language'] = array('lang1', 'lang2');
    |
    | NOTE: Do not include the "_lang" part of your file.  For example
    | "codeigniter_lang.php" would be referenced as array('codeigniter');
    |
    */
     
    $autoload['language'= array();
     
     
    /*
    | -------------------------------------------------------------------
    |  Auto-load Models
    | -------------------------------------------------------------------
    | Prototype:
    |
    |    $autoload['model'] = array('model1', 'model2');
    |
    */
     
    $autoload['model'= array();
     
     
    /* End of file autoload.php */
    /* Location: ./application/config/autoload.php */
    cs




     Line 56 부분에 database와 session 라이브러리를 자동으로 로드하도록 설정하였습니다.


     다음 절부터 게시판 글쓰기 할 때 로그인한 사용자만 글을 쓸 수 있도록 하겠습니다.









    7.2 로그인

     5.4절에서 users 테이블을 만들고 사용자 1명을 입력했습니다. 그 데이터를 이용해 로그인을 구현하겠습니다.


     로그인 절차는 아래와 같습니다.

      - 1. 로그인 페이지에서 아이디, 비밀번호를 입력 후 폼을 전송

      - 2. 로그인 컨트롤러에서 전송받은 아이디, 비밀번호와 매치되는 데이터가 있는지 검증

      - 3. 검증된 아이디가 있다면 아이디, 이메일 등 개인정보를 넣어서 세션을 생성

      - 4. 이후 사용자 인증이 필요한 페이지에서 세션으로 인증 여부를 체크하여 실행


     로그인된 이후에는 세션에 사용자 정보가 있어서 그 정보를 가지고 로그인 여부를 체크합니다. 로그인 컨트롤러부터 만들어 보겠습니다.









     * bbs/application/controllers/auth.php


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
     
    <?php
    if (!defined('BASEPATH'))
        exit('No direct script access allowed');
     
    /**
     * 사용자 인증 컨트롤러
     */
     
    class Auth extends CI_Controller {
     
        function __construct() {
            parent::__construct();
            $this -> load -> model('auth_m');
            $this -> load -> helper('form');
        }
     
        public function index() {
            $this -> login();
        }
     
        public function _remap($method) {
            $this -> load -> view('header_v');
     
            if (method_exists($this$method)) {
                $this -> {"{$method}"}();
            }
     
            $this -> load -> view('footer_v');
        }
     
        /**
         * 로그인 처리
         */
        public function login() {
            $this -> load -> library('form_validation');
     
            $this -> load -> helper('alert');
     
            $this -> form_validation -> set_rules('username''아이디''required|alpha_numeric');
            $this -> form_validation -> set_rules('password''비밀번호''required');
     
            echo '<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />';
     
            if ($this -> form_validation -> run() == TRUE) {
                $auth_data = array(
                    'username' => $this -> input -> post('username', TRUE),
                    'password' => $this -> input -> post('password', TRUE)
                );
                
                $result = $this -> auth_m -> login($auth_data);
                
                if ($result) {
                    $newdata = array(
                        'username' => $result -> username,
                        'email' => $result -> email,
                        'logged_in' => TRUE
                    );
                    
                    $this -> session -> set_userdata($newdata);
                    
                    alert('로그인 되었습니다.''/bbs/board/lists/ci_board/page/1');
                    exit;
                } else {
                    alert('아이디나 비밀번호를 확인해 주세요.''/bbs/board/lists/ci_board/page/1');
                    exit;
                }
            } else {
                $this -> load -> view('auth/login_v');
            }
        }
     
        public function logout() {
            $this -> load -> helper('alert');
            
            $this -> session -> sess_destroy();
            
            echo '<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />';
            alert('로그아웃 되었습니다.''/bbs/board/lists/ci_board/page/1');
            exit;
            
        }
     
    }
     
    cs




     Line 53: 아이디, 비밀번호가 맞는 경우의 처리이며 세션을 생성하기 위해 아이디와 이메일, 로그인 여부를 배열로 만듭니다.

     Line 60: 위에서 만든 배열을 가지고 세션을 생성합니다.



     

     다음은 모델으로, 아이디와 비밀번호를 전송하여 데이터베이스의 데이터와 일치하면 세션을 생성하는 간단한 구조입니다.


     로그인 후의 세션 데이터를 가져오는 부분은 뷰에서 설명하겠습니다.



     * bbs/application/models/auth_m.php


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
    <?php
    if (!defined('BASEPATH'))
        exit('No direct script access allowed');
     
    Class Auth_m extends CI_Model {
        function __construct() {
            parent::__construct();
        }
     
        /**
         * 아이디 비밀번호 체크
         *
         * @param array $auth 폼 전송받은 아이디, 비밀번호
         * @return array
         */
        function login($auth) {
            $sql = "SELECT username, email FROM users WHERE username = '" . $auth['username'] . "' AND password = '" . $auth['password'] . "' ";
     
            $query = $this -> db -> query($sql);
     
            if ($query -> num_rows() > 0) {
                return $query -> row();
            } else {
                return FALSE;
            }
        }
     
    }
     
    cs









     뷰는 로그인 폼 페이지와 헤더 페이지를 작업합니다. 헤더 페이지에는 로그인 여부에 따라 로그인, 로그아웃 버튼을 표시하도록 수정합니다.



     * header_v.php


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
     
    <!DOCTYPE html>
    <html>
        <head>
            <meta charset="UTF-8"/>
            <meta name="apple-mobile-web-app-capable" content="yes" />
            <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no" />
            <title>CodeIgniter</title>
            <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
            <link type="text/css" rel='stylesheet' href="/bbs/include/css/bootstrap.css" />
        </head>
        <body>
            <div id="main">
                <header id="header" data-role="header" data-position="fixed">
                    <blockquote>
                        <p>
                            만들면서 배우는 CodeIgniter
                        </p>
                        <small>실행 예제</small>
                        <p>
    <?php
        if ( @$this -> session -> userdata('logged_in'== TRUE) {
    ?>
    <?php echo $this -> session -> userdata('username');?> 님 환영합니다. <a href="/bbs/auth/logout" class="btn">로그아웃</a>
    <?php
        } else {
    ?>
    <a href="/bbs/auth/login" class="btn btn-primary"> 로그인 </a>
    <?php
        }
    ?>
                        </p>
                    </blockquote>
                </header>
                <nav id="gnb">
                    <ul>
                        <li>
                            <a rel="external" href="/bbs/<?php echo $this -> uri -> segment(1); ?>/lists/<?php echo $this -> uri -> segment(3); ?>"> 게시판 프로젝트 </a>
                        </li>
                    </ul>
                </nav>
     
    cs




     


     헤더에 로그인 여부에 따라 처리했으면 로그인 폼 페이지를 만듭니다.


     * bbs/application/views/auth/login_v.php


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
    <article id="board_area">
        <header><h1></h1></header>
    <?php
        $attributes = array(
            'class' => 'form-horizontal',
            'id' => 'auth_login'
        );
        echo form_open('/auth/login'$attributes);
    ?>
        <fieldset>
            <legend>로그인</legend>
            <div class="control-group">
                <label class="control-label" for="input1">아이디</label>
                <div class="controls">
                    <input type="text" class="input-xlarge" id="input1" name="username"
                        value="<?php echo set_value('username'); ?>" />
                    <p class="help-block"></p>
                </div>
                <label class="control-label" for="input2">비밀번호</label>
                <div class="controls">
                    <input type="password" class="input-xlarge" id="input2" name="password"
                        value="<?php echo set_value('password'); ?>" />
                    <p class="help-block"></p>
                </div>
                <div class="controls">
                    <p class="help-block"><?php echo validation_errors();?></p>
                </div>
                
                <div class="form_actions">
                    <button type="submit" class="btn btn-primary">확인</button>
                    <button class="btn" onclick="document.location.reload()">취소</button>
                </div>
            </div>
        </fieldset>
    </article>
     
    cs




     위와 같이 작성하고 확인을 하기위해 웹 페이지에 접속합니다.



     초기 화면에서 로그인 버튼을 클릭하여 로그인 뷰(login_v.php)로 넘어갑니다.




















     로그인 뷰에서 아이디와 비밀번호를 입력한 뒤 확인 버튼을 클릭합니다.
























     로그인 후, 세션을 통하여 로그인된 정보가 상단에 비치되는 것을 확인 할 수 있습니다.









     


     



     로그인에 성공하면 데이터베이스의 ci_sessions 테이블에 아래와 같이 데이터가 입력됩니다.













    7.3 로그아웃

     로그아웃은 모델과 뷰가 필요없고 컨트롤러에서 세션 삭제하는 소스로 되어있습니다. 

     * 위에서 작성했습니다.








    7.4 게시판 소스에 사용자 인증 적용하기

     이번 절에서는 board 컨트롤러의 write() 함수와 modify() 함수, delete() 함수에 사용자 인증을 적용시켜 보겠습니다.


     로그인 여부를 체크하여 로그인되어 있지 않으면 로그인 페이지로 이동시키도록 하겠습니다.


     write() 함수는 로그인 여부만 체크하면 되지만 modify() 함수와 delete() 함수는 본인이 작성한 글만 수정, 삭제할 수 있기에 본인 여부도 확인합니다.



     

     7.4.1 게시물 쓰기에 사용자 인증 적용하기

      쓰기는 로그인되어 있는지 체크하는 부분데이터베이스에 입력할 때 username을 입력하는 소스를 추가합니다.


      board.php의 write 함수 부분만 수정해주시면 됩니다.


      * bbs/application/controllers/board.php


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    <?php
    if (!defined('BASEPATH'))
        exit('No direct script access allowed');
    /**
     *  게시판 메인 컨트롤러
     */
     
    class Board extends CI_Controller {
     
        .......
     
     
        /**
         * 게시물 쓰기
         */
        function write() {
     
            $this -> load -> helper('alert');
            echo '<meta http-equiv="content-type" content="text/html; charset=utf-8" />';
     
            if (@$this -> session -> userdata('logged_in'== TRUE) {
                // 폼 검증 라이브러리 로드
                $this -> load -> library('form_validation');
     
                // 폼 검증할 필드와 규칙 사전 정의
                $this -> form_validation -> set_rules('subject''제목''required');
                $this -> form_validation -> set_rules('contents''내용''required');
     
                if ($this -> form_validation -> run() == TRUE) {
                    // 글쓰기 POST 전송 시
     
                    // 주소 중에서 page 세그먼트가 있는지 검사하기 위해 주소를 배열로 반환
                    $uri_array = $this -> segment_explode($this -> uri -> uri_string());
     
                    if (in_array('page'$uri_array)) {
                        $pages = urldecode($this -> url_explode($uri_array'page'));
                    } else {
                        $pages = 1;
                    }
     
                    $write_data = array(
                        'table' => $this -> uri -> segment(3),
                        'subject' => $this -> input -> post('subject', TRUE), 
                        'contents' => $this -> input -> post('contents', TRUE),
                        'user_id' => $this -> session -> userdata('username'
                    );
     
                    $result = $this -> board_m -> insert_board($write_data);
     
                    if ($result) {
                        alert("입력되었습니다."'/bbs/board/lists/' . $this -> uri -> segment(3) . '/page/' . $pages);
                        exit ;
                    } else {
                        alert("다시 입력해주세요."'/bbs/board/lists/' . $this -> uri -> segment(3) . '/page/' . $pages);
                        exit ;
                    }
                } else {
                    // 쓰기 폼 view 호출
                    $this -> load -> view('board/write_v');
                }
     
            } else {
                alert('로그인 후 작성하세요''/bbs/auth/login/');
                exit;
            }
     
        }
     
     
        ...
     
    }
     
     
    cs




      로그인하지 않은 경우에 글 쓰기를 시도하면 아래와 같은 화면이 출력됩니다.






     


      다음으로 게시판 모델도 한 군데 수정해야합니다. insert_board() 함수를 수정하시길 바랍니다.




      * board_m.php


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
     
    <?php
    if (!defined('BASEPATH'))
        exit('No direct script access allowed');
     
    /**
     * 공통 게시판 모델
     */
     
    class Board_m extends CI_Model {
     
     
     
        ......
     
        
        /**
         * 게시물 입력
         * 
         * @param array $arrays 테이블 명, 게시물 제목, 게시물 내용 1차 배열
         * @return boolean 입력 성공여부
         */
        function insert_board($arrays) {
            $insert_array = array(
                'board_pid' => 0,
                'user_id' => $arrays['userid'],
                'user_name' => 'palpit',
                'subject' => $arrays['subject'],
                'contents' => $arrays['contents'],
                'reg_date' => date("Y-m-d H:i:s")
            );
            
            $result = $this->db->insert($arrays['table'], $insert_array);
            
            return $result;
        } 
     
     
        ....
     
     
    }
     
    cs








     7.4.2 게시물 수정에 사용자 인증 적용하기

      게시물 수정은 로그인 여부뿐만 아니라 본인 여부도 확인해야 합니다. 보통 사이트 관리자를 제외하고 본인이 작성한 글만 수정할 수가 있습니다. 


      컨트롤러에 소스를 추가합니다.



     * /controllers/board.php


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
     
    <?php
    if (!defined('BASEPATH'))
        exit('No direct script access allowed');
    /**
     *  게시판 메인 컨트롤러
     */
     
    class Board extends CI_Controller {
     
     
        ....
     
     
        /**
         * 게시물 수정
         */
        function modify() {
            $this -> load -> helper('alert');
            echo '<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />';
     
            $uri_array = $this -> segment_explode($this -> uri -> uri_string());
     
            if (in_array('page'$uri_array)) {
                $pages = urldecode($this -> url_explode($uri_array'page'));
            } else {
                $pages = 1;
            }
     
            if ( @$this->session->userdata['logged_in'== TRUE) {
                $write_id = $this->board_m->writer_check();
                
                if ( $write_id-> user_id != $this->session->userdata('username')) {
                    alert('본인이 작성한 글이 아닙니다.''/bbs/board/view/'.$this->uri->segment(3).'/'.$this->uri->segment(5).'/page/'.$pages);
                    exit;
                }
                
                $this->load->library('form_validation');
                
                // 폼 검증할 필드와 규칙 사전 정의
                $this -> form_validation -> set_rules('subject''제목''required');
                $this -> form_validation -> set_rules('contents''내용''required');
                
                if ( $this->form_validation->run() == TRUE) {
                    
                    
                    if (!$this -> input -> post('subject', TRUE) AND !$this -> input -> post('contents', TRUE)) {
                        alert('비정상적인 접근입니다.''bbs/board/lists/' . $this -> uri -> segment(3) . '/page/' . $pages);
                        exit ;
                    }
                    
                    $modify_data = array(
                        'table' => $this -> uri -> segment(3), 
                        'board_id' => $this -> uri -> segment(5), 
                        'subject' => $this -> input -> post('subject', TRUE), 
                        'contents' => $this -> input -> post('contents', TRUE)
                    );
                    
                    $result = $this -> board_m -> modify_board($modify_data);
                            
                    if ($result) {
                        alert('수정되었습니다.''bbs/board/lists/' . $this -> uri -> segment(3) . '/page/' . $pages);
                        exit ;
                    } else {
                        alert('다시 수정해 주세요.''bbs/board/view/' . $this -> uri -> segment(3) . '/board_id/' . $this -> uri -> segment(5) . '/page/' . $pages);
                        exit ;
                    }
                    
                } else {
                    $data['views'= $this->board_m->get_view($this->uri->segment(3), $this->uri->segment(5));
                    $this->load->view('board/modify_v'$data);
                }
            } else {
                alert('로그인 후 수정하세요''/bbs/auth/login/');
                exit;
            }
        }
     
        ......
     
     
    }
     
    cs







      다음으로 모델에서 writer_check() 함수를 추가합니다.


      * board_m.php


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
    <?php
    if (!defined('BASEPATH'))
        exit('No direct script access allowed');
     
    /**
     * 공통 게시판 모델
     */
     
    class Board_m extends CI_Model {
     
     
        ...
     
        
        /**
         * 게시물 작성자 아이디 반환
         * 
         * @return string 작성자 아이디
         */
        function writer_check() {
            $table = $this->uri->segment(3);
            $board_id = $this->uri->segment(5);
            
            $sql = "SELECT user_id FROM ".$table." WHERE board_id = '".$board_id."'";
            $query = $this->db->query($sql);
            
            return $query->row();
            
        }
    }
     
    cs










      임시로 만든 계정으로 로그인하여 기존의 게시물을 수정하려는 결과 아래와 같이 나옵니다.














     7.4.3 게시물 삭제에 사용자 인증 적용하기

      이번에는 게시물 삭제에 로그인 여부와 본인 인증을 추가하겠습니다.



      * board.php


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
     
    <?php
    if (!defined('BASEPATH'))
        exit('No direct script access allowed');
    /**
     *  게시판 메인 컨트롤러
     */
     
    class Board extends CI_Controller {
     
     
        ....
     
     
        /**
         * 게시물 삭제
         */
     
        function delete() {
     
            $this -> load -> helper('alert');
            echo '<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />';
     
            if ( @$this->session->userdata('logged_in'== TRUE) {
                $writer_id = $this->board_m->writer_check();
                
                if ( $writer_id-> user_id != $this->session->userdata('username')) {
                    alert('본인이 작성한 글이 아닙니다.''/bbs/board/view/'.$this->uri->segment(3).'/'.$this->uri->segment(5).'/page/'.$pages);
                    exit;
                }
                
                $return = $this->board_m->delete_content($this->uri->segment(3), $this->uri->segment(5));
                
                if ($return) {
                    alert('삭제되었습니다.''bbs/board/lists/' . $this -> uri -> segment(3) . '/page/' . $this -> uri -> segment(7));
                    exit ;
                } else {
                    alert('삭제 실패하였습니다.''bbs/board/view/' . $this -> uri -> segment(3) . '/board_id/' . $this -> uri -> segment(5) . '/page/' . $this -> uri -> segment(7));
                    exit ;
                }
                
            } else {
                alert('로그인 후 삭제하세요.''/bbs/auth/login/');
                exit;
            }
        }
     
    }
     
    cs










    * 이 포스트는 서적 '만들면서 배우는 CodeIgniter 프레임워크'를 참고하여 작성하였습니다



    댓글

Designed by Tistory.