php와 apache 연동은 이전 글을 참고, 이 글에선 서버 설정부터 진행을 한다.
DB연동 없이 간단하게 세션을 활용하여 로그인, 로그아웃을 처리를 해본다.
로컬 환경 기준으로 서버 설정 등을 변경하고 있으니 주의
1. Apache2.4의 httpd.conf 설정 변경
DocumentRoot "F:/php/www/my2/public"
<Directory "F:/php/www/my2/public">
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
위와 같이 코드를 본인 경로에 맞추어 작성해준다. 그리고 my2에 다운로드 한 CI4를 압축해제를 해준다.
2. CI4의 .htaccess 설정 변경
CI4 압축 해제 후에 public 폴더를 들어가보면 .htaccess 파일이 있다(없으면 파일 생성). .htaccess 파일을 열어서 다음과 같이 코드를 작성한다.
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /my2/
RewriteCond $1 !^(index\.php|images|captcha|data|include|uploads|robots\.txt)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php/$1 [L]
</IfModule>
복사&붙여넣기 할 때, RewriteBase 부분을 본인 프로젝트에 맞게 변경하면 된다.
3. CI4의 App.php 설정 변경
프로젝트 경로인 my2/app/Config/App.php를 열어 2가지를 아래처럼 수정해준다. 7070포트는 일부러 Apache2.4에서 설정을 한거라, 포트 설정을 따로 안했으면 그냥 localhost를 적으면 된다.
public string $baseURL = 'http://localhost:7070/my2/';
public string $indexPage = '';
4. CI4의 로그 레벨 설정
원래라면 .env 파일을 수정해서 개발 모드인지를 정해야 하지만 연습 단계이므로 강제로 로그 레벨을 올리는 설정을 한다.
my2/app/Config/Logger.php를 열어 수정한다. 열면 로그 레벨에 대해 나와있다. 로그 파일은 writable/logs/에 생성이 된다.
public $threshold = 9; //모든 메세지 출력
5. 로그인, 로그인 성공 화면 작성(예제니까 대충 만들어보자)
../my2/app/View/에 2개의 파일을 작성한다
<!-- login.php -->
<form method="post" action="login/authenticate">
<input type="text" name="username" placeholder="Username">
<input type="password" name="password" placeholder="Password">
<button type="submit">Login</button>
</form>
<?php if(session()->getFlashdata('error')): ?>
<p><?= session()->getFlashdata('error'); ?></p>
<?php endif; ?>
<!-- login_ok.php -->
<h2>Login Success!</h2>
<a href="login/logout">Logout</a>
6. 로그인 컨트롤러 작성
../my2/app/Controllers/에 다음과 같이 Login.php를 작성한다.
<?php
namespace App\Controllers;
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');
if ($username === 'admin' && $password === '1234') {
$session->set('isLoggedIn', true);
return redirect()->to('/login_ok');
} else {
$session->setFlashdata('error', '아이디 혹은 비밀번호가 잘못되었습니다.');
return redirect()->to('/login');
}
}
public function login_ok(){
if (!session()->get('isLoggedIn')) {
return redirect()->to('/login');
}
return view('login_ok');
}
public function logout(){
log_message('error', '로그아웃');
$session = session();
// 세션 데이터 삭제
$session->remove('isLoggedIn');
$session->destroy();
return redirect()->to('/login');
}
}
7. Routes.php 작성
../my2/app/Config/Routes.php를 열어 다음 코드를 추가한다.
<?php
use CodeIgniter\Router\RouteCollection;
/**
* @var RouteCollection $routes
*/
$routes->group('/my2', function($routes) {
$routes->get('/', 'Home::index');
$routes->get('login', 'Login::index');
$routes->post('login/authenticate', 'Login::authenticate');
$routes->get('login_ok', 'Login::login_ok');
$routes->get('login/logout', 'Login::logout');
});
내 프로젝트 설정과 서버 설정에서는 각 요청의 기본은 /my2를 기본으로 하기때문에 그룹화를 사용하였다.
8. 테스트
localhost:7070/my2/login을 주소창에 쳐보자
화면이 잘나온다. 그럼 먼저 서버에서 설정한 admin/1234를 입력해 로그인 해보자
그럼 다시 Logout을 눌러서 이번엔 아이디와 비밀번호를 틀리게 입력하고 로그인 해보자
그리고 localhost:7070/my2/login_ok를 주소창에 입력해 직접 접근해보자. 인증된 정보가 없으므로 다시 로그인 창으로 돌아와야 한다.
9. 다음 과제
로그인을 성공하고 나오는 페이지는 인증된 유저만 들어와야 한다.
이번 예제에서는 1회성으로 인증 값이 있는지 체크했다. 하지만 프로젝트 규모가 커진다고 했을 때, 각각 컨트롤러의 각각 메소드마다 추가해줄 순 없다. CI4의 필터 기능을 이용해서 특정 URL 맵핑의 경우에 로그인 체크를 상시해서 하지 않은 경우 로그인 화면으로 보내는 처리와 암호화를 해보자
'개발 > php' 카테고리의 다른 글
코드이그나이터4 - 단순 회원가입 기능 구현 (3) (0) | 2024.03.12 |
---|---|
코드이그나이터4 - 단순 로그인 기능 구현 DB 연결 (2) (0) | 2024.03.11 |
코드이그나이터 4 (2) - 시작 페이지 변경, 공통 페이지, 정적 파일 관리 (1) | 2024.02.28 |
코드이그나이터 4 (1) - 시작하기 (0) | 2024.02.27 |
php.ini 확장 기능 설정 (0) | 2024.02.27 |
댓글