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