CodeIgniter4で簡易版ログインシステムの実装方法(管理画面向け)
2024/05/31
CodeIgniter4で管理画面向けの簡易版ログインシステムを作成したい。通常のログインシステムだとアカウント情報(ID / PASS)をデータベースに登録しておき照合する形になるが、簡易版なので設定ファイル等にアカウント情報を記述しそちらと照合する形にしたい。以下に対応方法をメモ。
やりたいこと
- アカウントは1つのみと想定する
- アカウント情報は設定ファイルに記述し、照合する際はそちらを利用する
- ログインチェックは複数ページでも使いまわせる形にしたい
- ログアウト機能も作成したい
- バリデートはサーバ側で未入力チェックのみ
アカウント設定
/app/Config/Custom_Dashboard_Test.php
<?php define('LOGIN_ID', 'test_id'); define('LOGIN_PASS', '$2y$10$wUo4r1usvSAHHdVIztzETeNjaSkgzuQSLRZXS/Zi9Z1FjNCcnwahy'); //test_passをpassword_hash()したもの
password_hashについてはこちらのページ等で行うと良い。
ルーティング設定
/app/Config/Routes.php
$routes->add('/dashboard_test', 'Dashboard_Test_Controller::index', ['filter' => 'Dashboard_Test']); $routes->add('/dashboard_test/login', 'Dashboard_Test_Controller::login'); $routes->post('/dashboard_test/auth', 'Dashboard_Test_Controller::auth'); $routes->add('/dashboard_test/logout', 'Dashboard_Test_Controller::logout');
フィルター設定
/app/Config/Filters.php
$aliasesに以下を追記しておく。
'Dashboard_Test' => \App\Filters\Dashboard_Test::class,
/app/Filters/Dashboard_Test.php
<?php namespace App\Filters; use CodeIgniter\Filters\FilterInterface; use CodeIgniter\HTTP\RequestInterface; use CodeIgniter\HTTP\ResponseInterface; class Dashboard_Test implements FilterInterface { public function before(RequestInterface $request, $arguments = null) { $session = session(); if( $session->is_login !== true ){ return redirect()->to('/dashboard_test/login'); } } public function after(RequestInterface $request, ResponseInterface $response, $arguments = null) { } }
Views
/app/Views/dashboard_test/index.php
<html lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>ログイン後のページ</title> </head> <body> <a href="<?php echo base_url('dashboard_test/logout');?>">ログアウト</a> </body> </html>
/app/Views/dashboard_test/login.php
<html lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>ログインページ</title> </head> <body> <?php echo form_open_multipart('dashboard_test/auth');?> <input type="text" name="login_id" placeholder="login_id"><br> <input type="password" name="login_pass" placeholder="login_pass"><br> <input type="submit" value="送信"> <?php echo form_close();?> </body> </html>
Controllers
/app/Controllers/Dashboard_Test_Controller.php
<?php namespace App\Controllers; use \App\Models\Dashboard_Test_Model; class Dashboard_Test_Controller extends BaseController { public function __construct() { helper(['url','html','form']); } public function index() { echo view('/dashboard_test/index'); } public function login() { echo view('/dashboard_test/login'); } public function auth() { $dashboard_test_models = new Dashboard_Test_Model(); $flg = $dashboard_test_models->auth($_POST); $dir = ( $flg ) ? '/dashboard_test' : '/dashboard_test/login'; return redirect()->to($dir); } public function logout() { session()->destroy(); return redirect()->to('/dashboard_test/login'); } }
Models
/app/Models/Dashboard_Test_Model.php
<?php namespace App\Models; use CodeIgniter\Model; class Dashboard_Test_Model extends Model { function __construct() { parent::__construct(); //設定ファイル呼び出し require_once(APPPATH . 'Config' . DIRECTORY_SEPARATOR . 'Custom_Dashboard_Test.php'); } function auth( $param ) { if( !$param['login_id'] || !$param['login_pass'] ){ return false; } if( $param['login_id'] != LOGIN_ID || !password_verify($param['login_pass'], LOGIN_PASS) ){ return false; } $session = session(); $session->set(array('is_login' => true)); return true; } }
ここまで実装すれば「https://test.com/codeigniter4/dashboard_test/login」にアクセスすればログインページが表示され、ログイン後は「https://test.com/codeigniter4/dashboard_test」にリダイレクトする筈。また、未ログインで「https://test.com/codeigniter4/dashboard_test」にアクセスするとログインページにリダイレクトする。
解説等
アカウント情報等の定数定義について
環境設定だと.envになるんだろうけど、アカウント設定は違う気がしたのでこちらのサイトを参考に「/app/Config」ディレクトリに設定ファイルを作成し呼び出す形にした。
ログインチェックを複数ページで使いまわし
使いまわしが不要な場合はコントローラー内で分岐処理すればよいが、今回は使いまわしたかったのでコントローラフィルタにて対応した。
所感
必要最低限の実装となるがログイン機能としては使える筈。あとはセキュリティ面の考慮やバリデート機能等を追加していけば良いんじゃないかなと思う。
また、今回は簡易なものを作成したが、次は「アカウント作成」「ログイン時はMySQLのデータと照合」等を実装したユーザ用(サイトのフロント用)のログイン機能も作成したいところ。
関連記事
-
Codeigniter3で外部ファイル(CSS / JS)の読み込みと共通パーツ化する方法
CodeigniterでCSSやJSファイル等の外部ファイル読み込みたかった。ま ...
-
CodeIgniter4 & jQueryを用いて同一サイト内でajax通信する方法
CodeIgniter4.4.4 & jQueryを用いて同一サイト内で ...
-
CodeIgniter3でCronを実行する方法
CodeIgniter3系で特定の処理をCronで自動実行したかった。以下に設定 ...
-
CodeIgniter4&Bootstrap&jQueryで簡易版お問い合わせページの作成
CodeIgniter4.4.4&Bootstrap&jQuer ...
-
CodeIgniter4でフォームからファイルをアップロードし保存する方法
CodeIgniter4.4.4でformから画像等のファイルをアップロードし、 ...