— y2sunlight 2020-05-15
関連記事
ミドルウェアを使ってユーザの基本認証を実装します。本章ではApricotのユーザ認証機能を使用しているので、まだお読みでない方は先にそちらをご一読下さい。
基本認証は簡易的でログイン画面を作る必要もなく、少人数のユーザで使用する小規模なアプリ向けです。Webサーバの機能を使って基本認証を行うこともできますが、ログインユーザの管理が簡単にできるので、PHPによる基本認証機能の実装の方がお薦めです。尚、Apricotでは最終的に後述のセッション認証の方を採用します。
以下に、基本認証のミドルウェアを示します。
/apricot/app/Middleware/Auth
<?php namespace App\Middleware\Auth; use Core\Foundation\Response; use Core\Foundation\Invoker; use Core\Foundation\Middleware\Middleware; use App\Foundation\Security\AuthUser; /** * Basic認証 - Middleware */ class BasicAuth implements Middleware { /** * Excludeing controller * @var array */ private $exclude = [ ]; /** * Process incoming requests and produces a response * {@inheritDoc} * @see \Core\Foundation\Middleware\Middleware::invoke() */ public function process(Invoker $next): Response { // When exclude controller if (in_array(controllerName(), $this->exclude)) { return $next->invoke(); } // Verify whether user is authenticated if (AuthUser::verify()) { return $next->invoke(); } // Basic認証 if (array_key_exists('PHP_AUTH_USER', $_SERVER) && array_key_exists('PHP_AUTH_PW',$_SERVER)) { if (AuthUser::authenticate($_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW'])) { return $next->invoke(); } } // 未認証の場合は '401 Unauthorized' をクライアントに送信 $response = render('error.basic_auth', ['message'=>__('auth.basic.msg_needed_login')]) ->addHeader("HTTP/1.0 401 Unauthorized") ->addHeader('WWW-Authenticate: Basic realm="Enter username and password."'); return $response; } }
401 Unauthorized
をヘッダーに追加してブラウザに基本認証を要求します。AuthUser の使用方法については、こちらをご覧ください。
基本認証では 401 Unauthorized
ヘッダーをブラウザに送信する際に、エラー画面(ユーザが[キャンセル]ボタンを押した場合などで表示される画面)も送信する必要があります。以下に基本認証のミドルウェアでレンダリングしているエラー画面用のHTMLテンプレート( error.basic_auth )を示します。
/apricot/assets/views/error
{{-- 親レイアウト --}} @extends('error.layout') {{-- コンテンツ --}} @section('content') <div class="flex-row message"> <div class="mb">{{$message}}</div> <div><a href='{{route('')}}'>{{__('auth.basic.back')}}</a></div> </div> @endsection
ユーザ認証用の翻訳ファイル( auth.php )を作ります。
apricot/assets/lang/ja
<?php return [ 'basic'=>[ 'msg_needed_login'=>'このページを見るにはログインが必要です', 'back'=>'戻る', ], ];
基本認証のミドルウェアをアプリケーションに設置します。
/apricot/config
'setup' =>[ ... ], 'middleware' =>[ \App\Middleware\AccessLog::class, /* Access log */ \App\Middleware\VerifyCsrfToken::class, /* Verify CSRF Token */ \App\Middleware\Auth\BasicAuth::class, /* Basic Auth. */ ],
基本認証のテストをしてみましょう。初期状態(既定値)のユーザ名とパスワードは以下の通りです。初期のユーザ名とパスワードは idirom.setup.phpに設定されています。
'root'
''
※空文字ブラウザ上でホーム画面にアクセスすると:
http://localhost/ws2019/apricot/public/
次のような基本認証画面が表示されます。
(この画面はブラウザが表示しているのでブラウザによって異なります)
■ 正しいユーザ名とパスワードを入力して[ログイン]ボタンを押すと、ホーム画面が画面が表示されます。
■ 基本認証では、一旦認証されるとセッションが無くなるまでその状態が継続されます。ログアウトもできません。ログアウトしたい場合は、ブラウザを閉じて下さい。
基本認証画面で[キャンセル]ボタンを押した場合は以下のエラー画面が表示されます。