メインメニュー
XAMPP アレンジ
IED
WSL2
-
道具箱
リポジトリ編
フレームワーク編
公開ソフトウェア
メタ
リンク
- PHP ライブラリ
- PHP 言語
apricot:ext:basic-authApricot 基本認証
— y2sunlight 2020-05-15
関連記事
- Apricot 拡張
- Apricot 基本認証
ミドルウェアを使ってユーザの基本認証を実装します。本章ではApricotのユーザ認証機能を使用しているので、まだお読みでない方は先にそちらをご一読下さい。
基本認証は簡易的でログイン画面を作る必要もなく、少人数のユーザで使用する小規模なアプリ向けです。Webサーバの機能を使って基本認証を行うこともできますが、ログインユーザの管理が簡単にできるので、PHPによる基本認証機能の実装の方がお薦めです。尚、Apricotでは最終的に後述のセッション認証の方を採用します。
ミドルウェア
以下に、基本認証のミドルウェアを示します。
/apricot/app/Middleware/Auth
- BasicAuth.php
<?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; } }
- Middleware インターフェースの process() メソッドを実装します。
- $this->exclude 配列に含まれているコントローラは認証から除外します。(公開のWebAPIなど)
- AuthUser::verify() で既に認証されているかを調べ、認証されていれば次の処理に制御を渡します。
- まだユーザ認証されていない場合:
- AuthUser::authenticate() にユーザの入力したアカウント情報を渡し認証を行います。
- 認証が成功した場合:
- 次の処理に制御を渡します。
認証が失敗した場合:- ヘルパー関数 render() を呼び出してレスポンスをレンダリングします。
- render(string $view=null, array $variables=[])
- $view : テンプレート名
上例では assets/views/error/basic_auth.blade.php がテンプレートファイルになります - $variables : テンプレート変数の連想配列
上例では $messageをテンプレートに渡しています。
401 Unauthorized
をヘッダーに追加してブラウザに基本認証を要求します。AuthUser の使用方法については、こちらをご覧ください。
エラー画面
基本認証では
401 Unauthorized
ヘッダーをブラウザに送信する際に、エラー画面(ユーザが[キャンセル]ボタンを押した場合などで表示される画面)も送信する必要があります。以下に基本認証のミドルウェアでレンダリングしているエラー画面用のHTMLテンプレート( error.basic_auth )を示します。/apricot/assets/views/error
- basic_auth.blade.php
{{-- 親レイアウト --}} @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
- 継承している親テンプレート(error.layout)はエラー画面共通のレイアウトです。
翻訳テキスト
ユーザ認証用の翻訳ファイル( auth.php )を作ります。
apricot/assets/lang/ja
- auth.php
<?php return [ 'basic'=>[ 'msg_needed_login'=>'このページを見るにはログインが必要です', 'back'=>'戻る', ], ];
基本認証の設定
基本認証のミドルウェアをアプリケーションに設置します。
/apricot/config
- app.php
'setup' =>[ ... ], 'middleware' =>[ \App\Middleware\AccessLog::class, /* Access log */ \App\Middleware\VerifyCsrfToken::class, /* Verify CSRF Token */ \App\Middleware\Auth\BasicAuth::class, /* Basic Auth. */ ],
- middleware にミドルウェア \App\Middleware\Auth\BasicAuth::class を追加します。
テスト実行
基本認証のテストをしてみましょう。初期状態(既定値)のユーザ名とパスワードは以下の通りです。初期のユーザ名とパスワードは idirom.setup.phpに設定されています。
- ユーザ :
'root'
- パスワード :
''
※空文字
ブラウザ上でホーム画面にアクセスすると:
http://localhost/ws2019/apricot/public/
次のような基本認証画面が表示されます。
(この画面はブラウザが表示しているのでブラウザによって異なります)■ 正しいユーザ名とパスワードを入力して[ログイン]ボタンを押すと、ホーム画面が画面が表示されます。
■ 基本認証では、一旦認証されるとセッションが無くなるまでその状態が継続されます。ログアウトもできません。ログアウトしたい場合は、ブラウザを閉じて下さい。
基本認証画面で[キャンセル]ボタンを押した場合は以下のエラー画面が表示されます。
apricot/ext/basic-auth.txt · 最終更新: 2020/06/08 14:03 by tanaka
コメント