본문 바로가기
개발/php

코드이그나이터4 - 단순 로그인 기능 구현 DB 연결 (2)

by wusdlqslek 2024. 3. 11.

이번 포스팅에서는 MariaDB와 CI4를 연동해서 단순하게 로그인 기능을 구현해보려고 한다.

MariaDB 설치, php 확장 설정은 다른 글을 참고하길 바란다.

 

0. DB 생성

 

1. 테이블 생성

CREATE TABLE ci_user (
    user_no INT AUTO_INCREMENT PRIMARY KEY,
    user_id VARCHAR(100) NOT NULL,
    user_pw VARCHAR(255) NOT NULL,
    user_name VARCHAR(100) NOT NULL,
    user_rank INT NOT NULL DEFAULT 9
);

 

이후 필터 기능을 통해 로그인 한 사용자 중 권한을 체크하여 관리자 페이지 접근 권한도 구현할 계획이므로 user_rank를 추가하였다. 기본값은 9(일반)이며, 관리자는 1을 줄 생각이다.

 

2. CI4의 DB 커넥션 설정

..\app\Config\Database.php 파일을 열어 본인 설정에 맞게 아래 값들을 수정한다

    public array $default = [
        'DSN'          => '',
        'hostname'     => 'localhost',
        'username'     => 'root',
        'password'     => '1234',
        'database'     => 'ci4_test',
        'DBDriver'     => 'MySQLi',
        'DBPrefix'     => '',
        'pConnect'     => false,
        'DBDebug'      => true,
        'charset'      => 'utf8',
        'DBCollat'     => 'utf8_general_ci',
        'swapPre'      => '',
        'encrypt'      => false,
        'compress'     => false,
        'strictOn'     => false,
        'failover'     => [],
        'port'         => 3306,
        'numberNative' => false,
    ];

 

3. 최초 관리자 계정 생성하기

이전 글에서 로그인 컨트롤러를 만들었었다. 로그인 컨트롤러에서 관리자 계정 비밀번호 암호화 값을 확인하기 위해 로그인 검증하는 메소드에 아래와 같이 입력해보자.

$password = '1234'; // 사용할 비밀번호
$hashedPassword = password_hash($password, PASSWORD_DEFAULT); // 비밀번호 암호화
log_message('debug','ENC => '.$hashedPassword);

 

그리고 웹 페이지를 실행해 로그인 처리를 하면..\writable\logs\오늘날짜.log 에 암호화된 비밀번호가 있을 것이다. 이 값을 활용해서 테이블에 ROW를 넣는다.(INSERT 구현 등이 귀찮아서 대충 계정 하나를 만드는 것이므로 실무에서 이 방법을 사용해선 안된다)

 

4. 생성한 테이블과 상호작용하는 Model을 생성

..\app\Models\UserModel.php

<?php namespace App\Models;

use CodeIgniter\Model;

class UserModel extends Model{
    protected $table = 'ci4_user';
    protected $primaryKey = 'user_no';
    protected $allowedFields = ['user_no','user_id', 'user_pw','user_name','user_rank'];
}

 

5. 로그인 컨트롤러 수정

<?php namespace App\Controllers;

//★ 사용 할 모델 로드
use App\Models\UserModel;

class Login extends BaseController{
    public function index(){
        // 로그인 폼 뷰를 로드합니다.
        return view('login');
    }

    public function authenticate(){
        $session = session();

        $username = $this->request->getPost('username');
        $password = $this->request->getPost('password');

        //★ 데이터베이스에서 값을 가져온다
        $model = new UserModel();
        $data = $model -> where('user_id', $username)->first();

        if ($data) {
            $pass = $data['user_pw'];            
            if (password_verify($password, $pass)) {
                $ses_data = [
                    'user_no' => $data['user_no'],
                    'user_id' => $data['user_id'],
                    'user_name' => $data['user_name'],
                    'user_rank' => $data['user_rank'],
                    'logged_in' => TRUE
                ];
                $session->set($ses_data); // 세션에 사용자 정보 저장
                $session->set('isLoggedIn', true);                
                return redirect()->to('/login_ok');
            } else {
                $session->setFlashdata('error', '아이디 또는 비밀번호가 일치하지 않습니다.');
                return redirect()->to('/login');
            }
        } else {
            $session->setFlashdata('error', '아이디 또는 비밀번호가 일치하지 않습니다.');
            return redirect()->to('/login');
        }
    }

    public function login_ok(){        
        $session = session();
        if (!session()->get('isLoggedIn')) {
            return redirect()->to('/login');
        }
        //★ 사용자 정보를 배열로 만들어 뷰에 전달            
        $userData = [
            'user_no' => $session->get('user_no'),
            'user_id' => $session->get('user_id'),
            'user_name' => $session->get('user_name'),
            'user_rank' => $session->get('user_rank'),
            'logged_in' => $session->get('logged_in')
        ];
        
        return view('login_ok',['userData' => $userData]);
    }

    public function logout(){
        log_message('error', '로그아웃');
        $session = session();

        // 세션 데이터 삭제
        $session->remove('isLoggedIn');
    
        $session->destroy();
        return redirect()->to('/login');
    }
}

 

6. 로그인 성공 화면에서 사용자 정보를 보여주기

<h2>Login Success!</h2>
<a href="member">멤버 페이지로 이동</a> <!-- 이 부분을 추가합니다. -->
<a href="login/logout">Logout</a>
<?php    
    print_r($userData);    
?>

 

7. 결과 화면

 

다음 글에서는 회원 가입을 시키고, 중복된 아이디는 사용하지 못하게 해보자.

 

반응형

댓글