이번 포스팅에서는 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. 결과 화면
다음 글에서는 회원 가입을 시키고, 중복된 아이디는 사용하지 못하게 해보자.
반응형
'개발 > php' 카테고리의 다른 글
코드이그나이터4 - 단순 회원정보 수정 (4) (0) | 2024.03.18 |
---|---|
코드이그나이터4 - 단순 회원가입 기능 구현 (3) (0) | 2024.03.12 |
코드이그나이터4 - 단순 로그인 기능 구현 (1) (0) | 2024.03.06 |
코드이그나이터 4 (2) - 시작 페이지 변경, 공통 페이지, 정적 파일 관리 (1) | 2024.02.28 |
코드이그나이터 4 (1) - 시작하기 (0) | 2024.02.27 |
댓글