CodeIgniter4の公式認証ライブラリCodeIgniter Shieldを使う

CodeIgniter4の公式認証ライブラリCodeIgniter Shieldを使ってみます。 CodeIgniter Shieldは現在ベータリリースです。

動作確認環境

  • CodeIgniter 4.2.6
  • CodeIgniter Shield dev-develop (67b14ad)
  • PHP 8.0.21
  • MySQL 5.7
  • macOS 10.15.7

インストール

CodeIgniter4のインストール

$ composer create-project codeigniter4/appstarter ci4-shield-test

CodeIgniter Shieldのインストール

ComposerでCodeIgniter Shieldの最新開発版をインストールします。

$ cd ci4-shield-test/
$ composer require codeigniter4/shield:dev-develop

データベースの作成

CREATE DATABASE `ci_shield` DEFAULT CHARACTER SET utf8mb4;
GRANT ALL PRIVILEGES ON ci_shield.* TO dbuser@localhost IDENTIFIED BY 'dbpasswd';

設定

CodeIgniter4の設定

以下のように設定を日本仕様などに変更しておきます。

--- a/app/Config/App.php
+++ b/app/Config/App.php
@@ -37,7 +37,7 @@ class App extends BaseConfig
      *
      * @var string
      */
-    public $indexPage = 'index.php';
+    public $indexPage = '';

     /**
      * --------------------------------------------------------------------------
@@ -70,7 +70,7 @@ class App extends BaseConfig
      *
      * @var string
      */
-    public $defaultLocale = 'en';
+    public $defaultLocale = 'ja';

     /**
      * --------------------------------------------------------------------------
@@ -97,7 +97,7 @@ class App extends BaseConfig
      *
      * @var string[]
      */
-    public $supportedLocales = ['en'];
+    public $supportedLocales = ['en', 'ja'];

     /**
      * --------------------------------------------------------------------------
@@ -109,7 +109,7 @@ class App extends BaseConfig
      *
      * @var string
      */
-    public $appTimezone = 'America/Chicago';
+    public $appTimezone = 'Asia/Tokyo';

     /**
      * --------------------------------------------------------------------------

.env

$ cp env .env

以下のように変更します。

CI_ENVIRONMENT = development

app.baseURL = 'http://localhost:8080/'

database.default.hostname = localhost
database.default.database = ci_shield
database.default.username = dbuser
database.default.password = dbpasswd
database.default.DBDriver = MySQLi
database.default.DBPrefix =
database.default.port = 3306

Shieldのセットアップ

セットアップコマンドを実行します。

$ php spark shield:setup
CodeIgniter v4.2.6 Command Line Tool - Server Time: 2022-09-07 15:02:01 UTC+09:00

  Created: APPPATH/Config/Auth.php
  Created: APPPATH/Config/AuthGroups.php
  Updated: APPPATH/Controllers/BaseController.php
  Updated: APPPATH/Config/Routes.php
  Updated: We have updated file 'APPPATH/Config/Security.php' for security reasons.
  Run `spark migrate --all` now? [y, n]: y
Running all new migrations...
    Running: (CodeIgniter\Shield) 2020-12-28-223112_CodeIgniter\Shield\Database\Migrations\CreateAuthTables
    Running: (CodeIgniter\Settings) 2021-07-04-041948_CodeIgniter\Settings\Database\Migrations\CreateSettingsTable
    Running: (CodeIgniter\Settings) 2021-11-14-143905_CodeIgniter\Settings\Database\Migrations\AddContextColumn
Migrations complete.

設定とDBマイグレーションが完了しました。

以下のテーブルが作成されました。

$ php spark db:table --metadata

CodeIgniter v4.2.6 Command Line Tool - Server Time: 2022-09-07 15:08:43 UTC+09:00

Here is the list of your database tables:
  [0]  auth_groups_users
  [1]  auth_identities
  [2]  auth_logins
  [3]  auth_permissions_users
  [4]  auth_remember_tokens
  [5]  auth_token_logins
  [6]  migrations
  [7]  settings
  [8]  users

migrations は CodeIgniter4 のデータベースマイグレーション用、settings は codeigniter4/settings 用のテーブルです。

フィルター設定

ひとまず、トップページにフィルターを設定します。ログインが必要なように、session フィルターを指定します。

--- a/app/Config/Routes.php
+++ b/app/Config/Routes.php
@@ -35,7 +35,7 @@ $routes->set404Override();

 // We get a performance increase by specifying the default
 // route since we don't have to scan directories.
-$routes->get('/', 'Home::index');
+$routes->get('/', 'Home::index', ['filter' => 'session']);

 service('auth')->routes($routes);

ルーティングの確認

ルートを確認します。

$ php spark routes

CodeIgniter v4.2.6 Command Line Tool - Server Time: 2022-09-07 15:05:02 UTC+09:00

+--------+-------------------------+--------------------------------------------------------------------+----------------+-----------------+
| Method | Route                   | Handler                                                            | Before Filters | After Filters   |
+--------+-------------------------+--------------------------------------------------------------------+----------------+-----------------+
| GET    | /                       | \App\Controllers\Home::index                                       | session        | session toolbar |
| GET    | register                | \CodeIgniter\Shield\Controllers\RegisterController::registerView   |                | toolbar         |
| GET    | login                   | \CodeIgniter\Shield\Controllers\LoginController::loginView         |                | toolbar         |
| GET    | login/magic-link        | \CodeIgniter\Shield\Controllers\MagicLinkController::loginView     |                | toolbar         |
| GET    | login/verify-magic-link | \CodeIgniter\Shield\Controllers\MagicLinkController::verify        |                | toolbar         |
| GET    | logout                  | \CodeIgniter\Shield\Controllers\LoginController::logoutAction      |                | toolbar         |
| GET    | auth/a/show             | \CodeIgniter\Shield\Controllers\ActionController::show             |                | toolbar         |
| POST   | register                | \CodeIgniter\Shield\Controllers\RegisterController::registerAction |                | toolbar         |
| POST   | login                   | \CodeIgniter\Shield\Controllers\LoginController::loginAction       |                | toolbar         |
| POST   | login/magic-link        | \CodeIgniter\Shield\Controllers\MagicLinkController::loginAction   |                | toolbar         |
| POST   | auth/a/handle           | \CodeIgniter\Shield\Controllers\ActionController::handle           |                | toolbar         |
| POST   | auth/a/verify           | \CodeIgniter\Shield\Controllers\ActionController::verify           |                | toolbar         |
| CLI    | ci(.*)                  | \CodeIgniter\CLI\CommandRunner::index/$1                           |                |                 |
+--------+-------------------------+--------------------------------------------------------------------+----------------+-----------------+

Webサーバーの起動

$ php spark serve

ユーザー登録

ユーザー登録ページ

http://localhost:8080/register にアクセスします。

以下で登録します。

    メール:admin@example.jp
ユーザー名:admin
パスワード:passw0rd!

登録が完了すると、ログイン状態となり、トップページにリダイレクトされます。

http://localhost:8080/logout にアクセスするとログアウトします。

ログイン

ログインページ

http://localhost:8080/ にブラウザでアクセスします。

http://localhost:8080/login にリダイレクトされました。

先ほど作成したユーザーでログインします。

    メール:admin@example.jp
パスワード:passw0rd!

ログインが成功すると、トップページにリダイレクトされます。

右下のアイコンからデバッグツールバーを表示させて、Authデータを見ることで、ログイン状態であることがわかります。

http://localhost:8080/logout にアクセスするとログアウトします。

参考

Date: 2022/09/08

Tags: codeigniter, codeigniter4, database, auth