特定のカスタム投稿タイプ(Custom Post Type)ページにだけBasic認証を適用する具体的な手法を解説します。
公開前のクライアント向けプレビューや、関係者限定の情報など、特定のコンテンツを「カギ付き」にする必要があるWEBデザイナーにとっては、必須とも言える知識でしょう。
特定ページへのBasic認証設定をサボると生じる問題(問題放置コスト)
「どうせクローラーには見つからないだろう」「誰もURLを知らないから大丈夫」と、特定の非公開コンテンツへのBasic認証設定を怠ると、以下のような深刻な問題(コスト)が発生する可能性があります。クライアントへの信頼失墜リスク
プレビューURLが万が一流出し、開発中の情報や未完成のデザインが第三者に露見した場合、情報管理体制への信用が大きく揺らぎます。クライアントワークにおいて、信頼の回復は時間的にも金銭的にも大きなコストです。
また、未完成の状態で検索エンジンにインデックスされると、品質の低いコンテンツとみなされ、サイト全体の評価を下げる原因となりかねません。
ボットや悪意のあるアクセスが特定ページに集中した際、認証によるアクセス制限がないと、サーバーに余計な負荷がかかってしまう可能性も排除できませんね。
こうしたリスクを未然に防ぎ、コンテンツをしっかりとガードするための「お守り」として、Basic認証の設定は非常に重要です。
functions.phpに認証処理の核となる関数を記述する(PHPコード)
Basic認証を実装するにあたり、まずテーマフォルダ内の functions.php に、認証処理の本体となるPHP関数を記述します。この関数は、ユーザー名とパスワードを検証し、一致しない場合は認証ダイアログを表示してアクセスを拒否する役割を担います。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
/ * Basic認証の処理を行う関数 * * @param array $auth_list ユーザーIDとパスワードのリスト * @param string $realm 認証ダイアログに表示される領域名 * @param string $failed_text 認証失敗時に表示されるメッセージ * @return string|void 認証成功時はユーザーID、失敗時は処理停止 */ function web_antena_basic_auth(array $auth_list, string $realm = "Restricted Area", string $failed_text = "認証に失敗しました") { // ユーザー名とパスワードが送信されているか確認 $user_id = $_SERVER['PHP_AUTH_USER'] ?? ''; $password = $_SERVER['PHP_AUTH_PW'] ?? ''; // 送信されたユーザーIDが$auth_listに存在し、パスワードも一致するか検証 if (isset($auth_list[$user_id]) && $auth_list[$user_id] === $password) { // 認証成功 return $user_id; } // 認証失敗時:ヘッダーを送信しアクセスを拒否 header('WWW-Authenticate: Basic realm="' . $realm . '"'); header('HTTP/1.0 401 Unauthorized'); header('Content-type: text/html; charset=' . mb_internal_encoding()); // 処理を停止し、失敗メッセージを表示 die($failed_text); } |
特定のカスタム投稿タイプに認証を適用する(条件分岐)
次に、前述の認証関数を、目的のカスタム投稿タイプでのアクセス時のみ実行するよう設定します。これは、サイト全体ではなく「特定のページだけ」をガードするための条件分岐です。WordPressのテンプレートファイルの header.php のファイルを開き、最上部に記述するのが最も手軽かつ確実な方法です。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
// 認証を適用したいカスタム投稿タイプ名に書き換えてください $target_post_type = 'custom_post_type_slug'; // 例: 'project_previews' など // Basic認証をかける条件をチェック // is_post_type_archive() はアーカイブページ // is_singular() は個別記事ページ if (is_post_type_archive($target_post_type) || is_singular($target_post_type)) : // 認証に利用するユーザーIDとパスワードのリストを定義 // "ユーザーID" => "パスワード" の形式で記述 $user_array = array( "webantena_user" => "secure_password_123", "client_name" => "client_pass_abc" ); // 認証関数を実行 web_antena_basic_auth($user_array); endif; ?> |
$target_post_type = 'custom_post_type_slug' で、認証を適用したいカスタム投稿タイプのスラッグを正確に指定します。ここを書き換えるだけで対応完了です。
if (is_post_type_archive($target_post_type) || is_singular($target_post_type)) : で、WordPressの条件タグを用いて、「その投稿タイプのアーカイブページ」または「その投稿タイプの個別ページ」のいずれかにアクセスがあった場合にのみ、内部の認証処理を実行するように制限しています。
$user_array = array(...) が最も重要な設定箇所です。キーにユーザーID、値にパスワードを記述します。セキュリティのため、複雑で推測されにくい文字列を設定するように心がけましょう。複数ユーザーを設定したい場合はカンマ区切りで追記可能です。
環境によっては.htaccessの追記が必要となるケース(セーフモード対策)
稀なケースですが、利用しているサーバー環境やPHPの設定(特に古いCGIモードやPHPがセーフモードで稼働している場合)によっては、上記の設定だけではBasic認証が正しく機能しないことがあります。具体的には、PHPが認証情報を格納する $_SERVER[‘PHP_AUTH_USER’] や $_SERVER[‘PHP_AUTH_PW’] を取得できない状態です。
この問題に対処するため、WordPressのルートディレクトリにある .htaccess ファイルに、以下のディレクティブを追記し、認証情報を強制的に取得させる必要があります。
|
1 2 3 4 5 6 |
# Basic認証情報が取得できない環境向けの設定 <IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{HTTP:Authorization} ^(.*) RewriteRule ^(.*) - [E=HTTP_AUTHORIZATION:%1] </IfModule> |
これで、指定したカスタム投稿タイプのページのみにBasic認証が適用され、コンテンツを安全に、確実に保護できます。


コメント