A Day in Serenity (Reloaded)

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

(2022年09月08日 追記) この記事は古くなっています。 「 CodeIgniter4の公式認証ライブラリCodeIgniter Shieldを使う」を参照してください。

CodeIgniter4の公式認証ライブラリCodeIgniter Shieldを使ってみます。 CodeIgniter Shieldは現在開発中です。

動作確認環境

  • CodeIgniter 4.2.0-dev (403a4c8)
  • CodeIgniter Shield dev-develop (6143def)
  • PHP 8.0.18
  • MySQL 5.7
  • macOS 10.15.7

インストール

CodeIgniter4のインストール

CodeIgniter 4.2.0-dev を使うため、ci4-app-template を使います。

$ composer create-project kenjis/ci4-app-template ci4-shield-test

CodeIgniter Shieldのインストール

ComposerでCodeIgniter Shieldをインストールします。

$ cd ci4-shield-test/
$ composer require codeigniter4/shield

データベースの作成

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 = ['ja', 'en'];
 /**
 * --------------------------------------------------------------------------
@@ -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 =

Configファイル

以下の設定ファイルを app/Config/ フォルダにコピーします。

  • vendor/codeigniter4/shield/src/Config/Auth.php
  • vendor/codeigniter4/shield/src/Config/AuthGroups.php

コピーしたファイルを更新します。

--- a/app/Config/Auth.php
+++ b/app/Config/Auth.php
@@ -1,6 +1,6 @@
 <?php
-namespace CodeIgniter\Shield\Config;
+namespace Config;
 use CodeIgniter\Config\BaseConfig;
 use CodeIgniter\Shield\Authentication\Actions\ActionInterface;
@@ -9,8 +9,9 @@ use CodeIgniter\Shield\Authentication\Authenticators\AccessTokens;
 use CodeIgniter\Shield\Authentication\Authenticators\Session;
 use CodeIgniter\Shield\Authentication\Passwords\ValidatorInterface;
 use CodeIgniter\Shield\Models\UserModel;
+use CodeIgniter\Shield\Config\Auth as ShieldAuth;
-class Auth extends BaseConfig
+class Auth extends ShieldAuth
 {
 /**
 * ////////////////////////////////////////////////////////////////////
--- a/app/Config/AuthGroups.php
+++ b/app/Config/AuthGroups.php
@@ -1,10 +1,11 @@
 <?php
-namespace CodeIgniter\Shield\Config;
+namespace Config;
 use CodeIgniter\Config\BaseConfig;
+use CodeIgniter\Shield\Config\AuthGroups as ShieldAuthGroups;
-class AuthGroups extends BaseConfig
+class AuthGroups extends ShieldAuthGroups
 {
 /**
 * --------------------------------------------------------------------

ヘルパー設定

--- a/app/Controllers/BaseController.php
+++ b/app/Controllers/BaseController.php
@@ -39,6 +39,8 @@ abstract class BaseController extends Controller
 public function initController(RequestInterface $request, ResponseInterface $response, LoggerInterface $logger): void
 {
+ $this->helpers = array_merge($this->helpers, ['auth', 'setting']);
+
 // Do Not Edit This Line
 parent::initController($request, $response, $logger);

Services設定

デフォルトのCodeIgniter4の場合は、この手順は必要ありません。

vendor/codeigniter4/shield/src/Config/Services.php に定義されている以下のメソッドを app/Config/Services.php にコピーします。

 /**
 * The base auth class
 */
 public static function auth(bool $getShared = true): Auth
 {
 if ($getShared) {
 return self::getSharedInstance('auth');
 }
 $config = config('Auth');
 return new Auth(new Authentication($config));
 }
 /**
 * Password utilities.
 */
 public static function passwords(bool $getShared = true): Passwords
 {
 if ($getShared) {
 return self::getSharedInstance('passwords');
 }
 return new Passwords(config('Auth'));
 }

codeigniter4/settings も Services を定義していましたので、それも追加します。

 /**
 * Returns the Settings manager class.
 */
 public static function settings(?SettingsConfig $config = null, bool $getShared = true): Settings
 {
 if ($getShared) {
 return static::getSharedInstance('settings', $config);
 }
 /** @var SettingsConfig $config */
 $config = $config ?? config('Settings');
 return new Settings($config);
 }

必要なクラスをインポートします。

use CodeIgniter\Settings\Config\Settings as SettingsConfig;
use CodeIgniter\Settings\Settings;
use CodeIgniter\Shield\Auth;
use CodeIgniter\Shield\Authentication\Authentication;
use CodeIgniter\Shield\Authentication\Passwords;

ルーティング設定

Shield用のルートを追加します。

--- a/app/Config/Routes.php
+++ b/app/Config/Routes.php
@@ -36,6 +36,8 @@ $routes->set404Override();
 // route since we don't have to scan directories.
 $routes->get('/', 'Home::index');
+service('auth')->routes($routes);
+
 /*
 * --------------------------------------------------------------------
 * Additional Routing

フィルター設定

ひとまず、トップページにフィルターを設定します。ログインが必要なように、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.1.9 Command Line Tool - Server Time: 2022年05月26日 17:04:35 UTC+09:00
+--------+-------------------------+--------------------------------------------------------------------+----------------------+-------------------------------+
| Method | Route | Handler | Before Filters | After Filters |
+--------+-------------------------+--------------------------------------------------------------------+----------------------+-------------------------------+
| GET | / | \App\Controllers\Home::index | session invalidchars | session secureheaders toolbar |
| GET | register | \CodeIgniter\Shield\Controllers\RegisterController::registerView | invalidchars | secureheaders toolbar |
| GET | login | \CodeIgniter\Shield\Controllers\LoginController::loginView | invalidchars | secureheaders toolbar |
| GET | login/magic-link | \CodeIgniter\Shield\Controllers\MagicLinkController::loginView | invalidchars | secureheaders toolbar |
| GET | login/verify-magic-link | \CodeIgniter\Shield\Controllers\MagicLinkController::verify | invalidchars | secureheaders toolbar |
| GET | logout | \CodeIgniter\Shield\Controllers\LoginController::logoutAction | invalidchars | secureheaders toolbar |
| GET | auth/a/show | \CodeIgniter\Shield\Controllers\ActionController::show | invalidchars | secureheaders toolbar |
| POST | register | \CodeIgniter\Shield\Controllers\RegisterController::registerAction | invalidchars csrf | secureheaders toolbar |
| POST | login | \CodeIgniter\Shield\Controllers\LoginController::loginAction | invalidchars csrf | secureheaders toolbar |
| POST | login/magic-link | \CodeIgniter\Shield\Controllers\MagicLinkController::loginAction | invalidchars csrf | secureheaders toolbar |
| POST | auth/a/handle | \CodeIgniter\Shield\Controllers\ActionController::handle | invalidchars csrf | secureheaders toolbar |
| POST | auth/a/verify | \CodeIgniter\Shield\Controllers\ActionController::verify | invalidchars csrf | secureheaders toolbar |
| CLI | ci(.*) | \CodeIgniter\CLI\CommandRunner::index/1ドル | | |
+--------+-------------------------+--------------------------------------------------------------------+----------------------+-------------------------------+

DBマイグレーション

マイグレーションを実行して必要なテーブルを作成します。

$ php spark migrate --all
CodeIgniter v4.1.9 Command Line Tool - Server Time: 2022年05月26日 16:52:53 UTC+09:00
すべての新しいマイグレーションを実行しています...
 実行中: (CodeIgniter\Shield) 2020年12月28日-223112_CodeIgniter\Shield\Database\Migrations\CreateAuthTables
 実行中: (CodeIgniter\Settings) 2021年07月04日-041948_CodeIgniter\Settings\Database\Migrations\CreateSettingsTable
 実行中: (CodeIgniter\Settings) 2021年11月14日-143905_CodeIgniter\Settings\Database\Migrations\AddContextColumn

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

auth_groups_users
auth_identities
auth_logins
auth_permissions_users
auth_remember_tokens
migrations
settings
users

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

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!

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

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

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

参考

Date: 2022年05月26日

Tags: codeigniter, codeigniter4, database, auth

A Day in Serenity (Reloaded) PHP, CodeIgniter, FuelPHP, Linux or something

Links

著書

[フレーム] [フレーム] [フレーム] [フレーム]

はじめてのフレームワークとしてのFuelPHP第2版(1) 環境構築編 はじめてのフレームワークとしてのFuelPHP第2版(2) 入門編

はじめてのフレームワークとしてのFuelPHP第2版(3) 実践編 徹底攻略PHP5技術者認定[上級]試験問題集 [PJ0-200]対応

FuelPHPに関する無料電子書籍

FuelPHP Advent Calendar 2013 FuelPHP Advent Calendar 2012

AltStyle によって変換されたページ (->オリジナル) /