CodeIgniter4の認証ライブラリMyth Authを使う

(2022-05-26 追記) 「CodeIgniter4の公式認証ライブラリCodeIgniter Shieldを使う」 も参照してください。

CodeIgniter4の認証ライブラリMyth Authを使い、チュートリアルの記事作成にはログインが必要にしてみます。

動作確認環境

  • CodeIgniter 4.1.5
  • Myth Auth 1.0.1
  • PHP 8.0.10
  • MySQL 8.0.27
  • Docker Desktop 4.2.0
  • macOS 10.15.7

インストール

Composerでのインストール

ComposerでMyth Authをインストールします。

$ composer require myth/auth

設定

設定ファイルを変更します。

メール設定

app/Config/Email.php に管理者のメールアドレスを設定します。

--- a/app/Config/Email.php
+++ b/app/Config/Email.php
@@ -9,12 +9,12 @@ class Email extends BaseConfig
     /**
      * @var string
      */
-    public $fromEmail;
+    public $fromEmail = 'admin@example.jp';

     /**
      * @var string
      */
-    public $fromName;
+    public $fromName = 'Admin User';

     /**
      * @var string

バリデーション設定

app/Config/Validation.php にバリデーションルールを追加します。

--- a/app/Config/Validation.php
+++ b/app/Config/Validation.php
@@ -24,6 +24,7 @@ class Validation
         FormatRules::class,
         FileRules::class,
         CreditCardRules::class,
+        \Myth\Auth\Authentication\Passwords\ValidationRules::class,
     ];

     /**

デバッグツールバー設定

コレクターを追加します。

--- a/app/Config/Toolbar.php
+++ b/app/Config/Toolbar.php
@@ -42,6 +42,7 @@ class Toolbar extends BaseConfig
         Files::class,
         Routes::class,
         Events::class,
+        \Myth\Auth\Collectors\Auth::class,
     ];

     /**

コントローラフィルター設定

フィルタークラスを追加します。

--- a/app/Config/Filters.php
+++ b/app/Config/Filters.php
@@ -19,6 +19,9 @@ class Filters extends BaseConfig
         'csrf'     => CSRF::class,
         'toolbar'  => DebugToolbar::class,
         'honeypot' => Honeypot::class,
+        'login'      => \Myth\Auth\Filters\LoginFilter::class,
+        'role'       => \Myth\Auth\Filters\RoleFilter::class,
+        'permission' => \Myth\Auth\Filters\PermissionFilter::class,
     ];

     /**

認証の設定

記事の作成ページ news/create にのみ、loginフィルターを設定します。

--- a/app/Config/Filters.php
+++ b/app/Config/Filters.php
@@ -60,5 +63,7 @@ class Filters extends BaseConfig
      *
      * @var array
      */
-    public $filters = [];
+    public $filters = [
+        'login' => ['before' => ['news/create*']],
+    ];
 }

ルーティング

モジュール(vendor/myth/auth)で設定されているルートが有効になるように、(:any) で受けているルールのプライオリティを下げます。

--- a/app/Config/Routes.php
+++ b/app/Config/Routes.php
@@ -22,6 +22,7 @@ $routes->setDefaultMethod('index');
 $routes->setTranslateURIDashes(false);
 $routes->set404Override();
 $routes->setAutoRoute(true);
+$routes->setPrioritize();

 /*
  * --------------------------------------------------------------------
@@ -36,7 +37,7 @@ $routes->get('/', 'Home::index');
 $routes->match(['get', 'post'], 'news/create', 'News::create');
 $routes->get('news/(:segment)', 'News::view/$1');
 $routes->get('news', 'News::index');
-$routes->get('(:any)', 'Pages::view/$1');
+$routes->get('(:any)', 'Pages::view/$1', ['priority' => 1]);

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

設定を確認しておきます。

$ php spark routes
CodeIgniter v4.1.5 Command Line Tool - Server Time: 2021-12-09 17:26:36 UTC+09:00

+--------+----------------------------+--------------------------------------------------------------+
| Method | Route                      | Handler                                                      |
+--------+----------------------------+--------------------------------------------------------------+
| GET    | /                          | \App\Controllers\Home::index                                 |
| GET    | news/create                | \App\Controllers\News::create                                |
| GET    | news/([^/]+)               | \App\Controllers\News::view/$1                               |
| GET    | news                       | \App\Controllers\News::index                                 |
| GET    | login                      | \Myth\Auth\Controllers\AuthController::login                 |
| GET    | logout                     | \Myth\Auth\Controllers\AuthController::logout                |
| GET    | register                   | \Myth\Auth\Controllers\AuthController::register              |
| GET    | activate-account           | \Myth\Auth\Controllers\AuthController::activateAccount       |
| GET    | resend-activate-account    | \Myth\Auth\Controllers\AuthController::resendActivateAccount |
| GET    | forgot                     | \Myth\Auth\Controllers\AuthController::forgotPassword        |
| GET    | reset-password             | \Myth\Auth\Controllers\AuthController::resetPassword         |
| GET    | (.*)                       | \App\Controllers\Pages::view/$1                              |
| POST   | news/create                | \App\Controllers\News::create                                |
| POST   | login                      | \Myth\Auth\Controllers\AuthController::attemptLogin          |
| POST   | register                   | \Myth\Auth\Controllers\AuthController::attemptRegister       |
| POST   | forgot                     | \Myth\Auth\Controllers\AuthController::attemptForgot         |
| POST   | reset-password             | \Myth\Auth\Controllers\AuthController::attemptReset          |
| CLI    | migrations/([^/]+)/([^/]+) | \CodeIgniter\Commands\MigrationsCommand::$1/$2               |
| CLI    | migrations/([^/]+)         | \CodeIgniter\Commands\MigrationsCommand::$1                  |
| CLI    | migrations                 | \CodeIgniter\Commands\MigrationsCommand::index               |
| CLI    | ci(.*)                     | \CodeIgniter\CLI\CommandRunner::index/$1                     |
+--------+----------------------------+--------------------------------------------------------------+

ログインページなどのコントローラが Myth\Auth 以下のものになっており、

| GET    | (.*)                       | \App\Controllers\Pages::view/$1

より上に設定されています。

DBマイグレーション

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

$ php spark migrate -n 'Myth\Auth'
CodeIgniter v4.1.5 Command Line Tool - Server Time: 2021-12-09 16:56:06 UTC+09:00

Running all new migrations...
    Running: (Myth\Auth) 2017-11-20-223112_App\Database\Migrations\CreateAuthTables
Done migrations.

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

auth_activation_attempts
auth_groups
auth_groups_permissions
auth_groups_users
auth_logins
auth_permissions
auth_reset_attempts
auth_tokens
auth_users_permissions
users

ユーザーの作成

サンプルのユーザーを作成します。

$ php spark auth:create_user user1 user1@example.jp
CodeIgniter v4.1.5 Command Line Tool - Server Time: 2021-12-09 17:39:41 UTC+09:00

New user created: user1, #1

作成したユーザーのパスワードを変更します。

$ php spark auth:set_password user1 password
CodeIgniter v4.1.5 Command Line Tool - Server Time: 2021-12-09 17:56:23 UTC+09:00

Password successfully set for user with identity: user1

ログインページ

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

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

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

ユーザー名:user1
パスワード:password

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

右下のアイコンからデバッグツールバーを表示させて、ユーザーの情報を確認できます。

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

Myth Authのカスタマイズ

Myth Authのファイルをカスタマイズしたい場合は、 publishコマンドを実行します。 Myth Authのファイルが app/ 以下にインストールされます。

$ php spark auth:publish
CodeIgniter v4.1.5 Command Line Tool - Server Time: 2021-12-09 16:36:40 UTC+09:00

Publish Migration? [y, n]: y
  Created: Database/Migrations/2017-11-20-223112_create_auth_tables.php
  Remember to run `spark migrate -all` to migrate the database.
Publish Models? [y, n]: y
  Created: Models/LoginModel.php
  Created: Models/UserModel.php
Publish Entities? [y, n]: y
  Created: Entities/User.php
Publish Controller? [y, n]: y
  Created: Controllers/AuthController.php
Publish Views? [y, n]: y
  Created: Views/Auth/_footer.php
  Created: Views/Auth/_header.php
  Created: Views/Auth/_message_block.php
  Created: Views/Auth/_navbar.php
  Created: Views/Auth/emails/activation.php
  Created: Views/Auth/emails/forgot.php
  Created: Views/Auth/forgot.php
  Created: Views/Auth/layout.php
  Created: Views/Auth/login.php
  Created: Views/Auth/register.php
  Created: Views/Auth/reset.php
Publish Filters? [y, n]: y
  Created: Filters/LoginFilter.php
  Created: Filters/PermissionFilter.php
  Created: Filters/RoleFilter.php
Publish Config file? [y, n]: y
  Created: Config/Auth.php
Publish Language file? [y, n]: y
  Created: Language/en/Auth.php

すべてに y と回答すると、 以下のファイルが作成されます。 必要なファイルをインストールし、変更してください。

app/Config/Auth.php
app/Controllers/AuthController.php
app/Database/Migrations/2017-11-20-223112_create_auth_tables.php
app/Entities/User.php
app/Filters/LoginFilter.php
app/Filters/PermissionFilter.php
app/Filters/RoleFilter.php
app/Language/en/Auth.php
app/Models/LoginModel.php
app/Models/UserModel.php
app/Views/Auth/_footer.php
app/Views/Auth/_header.php
app/Views/Auth/_message_block.php
app/Views/Auth/_navbar.php
app/Views/Auth/emails/activation.php
app/Views/Auth/emails/forgot.php
app/Views/Auth/forgot.php
app/Views/Auth/layout.php
app/Views/Auth/login.php
app/Views/Auth/register.php
app/Views/Auth/reset.php

参考

Date: 2021/12/09

Tags: codeigniter, codeigniter4, database, auth