CakePHP4でBasic認証を導入する方法

CakePHP4でBasic認証を導入する方法
2023年10月03日2023年10月10日 PR

Basic認証をかける場合、Apacheの設定や.htaccessに処理を記述するのが一般的ですが、CakePHPにも設定することができます。

Basic認証の処理をどこに記述するかはプロジェクトによって異なると思いますが、今回はCakePHP内にBasic認証を設定したいと思います。

実装する前の環境

Basic認証を導入するにあたって環境回りのバージョンになります。

  • フレームワーク:CakePHP4.x ※CakePHP3.x系でもいけそう
  • PHP:PHP8.1
  • DB:MySQL8
  • Webサーバー:Apache2.4

Basic認証は公式サイトとは異なるやり方です

CakePHPの公式サイトにもBasic認証のやり方が紹介されていますが、公式サイトのやり方はBasic認証のログイン情報をデータベースから参照するやり方が紹介されています。

今回紹介する方法は、データベースを使用せず事前に準備してある文字列で認証をおこなうやり方になります。

理由として、管理画面にアクセスする際に第一認証としてBasic認証で共通のログイン情報を入力してもらい、そのあと各個人のログイン情報で通常のログインしてもらうやり方を採用したいからです。

  1. 管理画面のログイン画面にアクセス
  2. 共通のbasic認証のIDとパスワードを入力
  3. ログインフォームに各個人のログイン情報を入力
  4. ログイン完了

Basic認証の処理をどこに記述するか

ぱっと思いつく方法として、共通のコントローラー(親クラス)に記述が思いつきますが、Basic認証の処理はコントローラーのタスクではないと思っています。

CakePHPにはミドルウェア機能が準備されています。今回はミドルウェア層にBasic認証処理を追加したいと思います。

Basic認証を実装する

早速実装していきたいと思います。

Basic認証用のミドルウェアを作成する

CakePHPのbakeコマンドにミドルウェアのファイルを生成するコマンドがあります。コマンドを実行してファイルを作成します。

bin/cake bake middleware HttpBasicAuth

コマンドを実行すると「~/src/Middleware/HttpBasicAuthMiddleware.php」ファイルが作成されます。

作成したファイルを下記のように書き換えます。

~/src/Middleware/HttpBasicAuthMiddleware.php
<?php

declare(strict_types=1);

namespace App\Middleware;

use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\MiddlewareInterface;
use Psr\Http\Server\RequestHandlerInterface;
use Cake\Http\Response;

/**
 * HttpBasicAuth middleware
 */
class HttpBasicAuthMiddleware implements MiddlewareInterface
{
    /**
     * Process method.
     *
     * @param \Psr\Http\Message\ServerRequestInterface $request The request.
     * @param \Psr\Http\Server\RequestHandlerInterface $handler The request handler.
     * @return \Psr\Http\Message\ResponseInterface A response.
     */
    public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
    {

        $user = 'your_username';
        $pass = 'your_password';

        if (
            !isset($_SERVER['PHP_AUTH_USER']) || !isset($_SERVER['PHP_AUTH_PW']) ||
            $_SERVER['PHP_AUTH_USER'] !== $user || $_SERVER['PHP_AUTH_PW'] !== $pass
        ) {
            $response = (new Response())->withStatus(401)
                ->withHeader('WWW-Authenticate', 'Basic realm="My Realm"');
            $response->getBody()->write('Authentication required');
            return $response;
        }

        return $handler->handle($request);
    }
}

ソース内にある下記は、Basic認証のIDとパスワード部分になるので書き換えてください。

分かりやすいようにべた書きしていますが、IDとパスワードはConfigファイルやenvファイルを参照するようにしたほうが良いです。

$user = 'your_username';
$pass = 'your_password';

Routesからミドルウェアを呼び出す

つぎに作成したミドルウェアを呼び出すために、routes.phpを修正します。

今回管理画面にBasic認証をかけたいので下記のように記述しています。

~/config/routes.php
use App\Middleware\HttpBasicAuthMiddleware;


$routes->scope('/', function (RouteBuilder $builder) {
    $builder->prefix('admin', function ($routes) {
        $routes->registerMiddleware('HttpBasicAuth', new HttpBasicAuthMiddleware())->applyMiddleware('HttpBasicAuth');

        $routes->fallbacks('DashedRoute');
        $routes->connect('/', ['controller' => 'Top', 'prefix' => 'Admin']);
    });
});

ちなみに全画面にBasic認証かけたい場合は、Application.phpファイルのmiddlewareメソッドに追加することで全画面にBasic認証をかけることができます。

~/src/Application.php
public function middleware(MiddlewareQueue $middlewareQueue): MiddlewareQueue
{
   $middlewareQueue->add(new HttpBasicAuthMiddleware());

   return $middlewareQueue;
}

Basic認証の設定は以上になります。

Basic認証の動作確認

WebブラウザからBasic認証が有効になっているか確認してください。

basic認証

認証失敗時のエラーメッセージを変更したい場合は、Basic認証のレスポンス情報を修正することで変更することができます。

$response->getBody()->write('認証に失敗しました。古株スタッフに確認してください。');

最後に

今回CakePHP4でBasic認証を設定する方法を紹介しました。

CakePHPのバージョンによって多少設定方法が異なりますが、簡単に設定することができます。

ぜひ試してみてください。

コメント

コメントを残す

お名前(任意)
コメント:新規