勉強したことのメモ

Webエンジニア / プログラマが勉強したことのメモ。

CodeIgniter4で簡易版ログインシステムの実装方法(管理画面向け)

  PHP CodeIgniter

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のデータと照合」等を実装したユーザ用(サイトのフロント用)のログイン機能も作成したいところ。

 - PHP CodeIgniter

  関連記事

CodeIgniter4で特定のページにアクセスがあった際に301リダイレクトさせる方法

CodeIgniter4で特定のページにアクセスがあった際に301リダイレクトさ ...

Codeigniter4でエラーログ設定、出力及び確認方法

Codeigniter4.4.4でエラーログの設定を行い特定のファイルに出力させ ...

Codeigniter4でMySQLに接続しCRUD操作する方法

Codeigniter4.4.4でMySQLに接続しCRUD操作したい。また、任 ...

CodeIgniter4でコントローラ実行の前後に指定したイベントを実行する方法

CodeIgniter4で特定の条件の場合は指定したページにリダイレクトさせたい ...

Codeigniter4で外部ファイル(CSS / JS)の読み込みと共通パーツ化する方法

Codeigniter4.4.4でCSS及びJavaScriptファイルを設置し ...