Memo

メモ > 技術 > フレームワーク: Laravel > Basic認証

Basic認証
■nginxによる設定 例えば以下のように設定されていたとして、
location / { try_files $uri /index.php?$query_string; }
以下のようにすれば /var/www/main/.htpasswd; によってBasic認証が設定される
location / { auth_basic "Auth"; auth_basic_user_file /var/www/main/.htpasswd; try_files $uri /index.php?$query_string; }
NginxでBasic認証(Laravel) | Qrunch(クランチ) https://qrunch.net/@G8AaKC38xzUeSbBe/entries/u9XM60aUWnMgTkts ■プログラムによる設定 ベーシック認証(自作)について - Laravel学習帳 https://laraweb.net/practice/1095/ 基本的には上の解説の流れで実装したが、ユーザ名とパスワードは .env で管理できるようにした 「テスト環境では、特定のURLに対してBasic認証をかける」という用途で使用 プログラムで制御すると ・nginx環境ではBasic認証の設定に「service nginx reload」が必要なので、気軽に設定変更できない ・「特定のディレクトリのみに設定」もPHPの実行が絡むとややこしい ・またロードバランサー環境では「IPアドレスによっては認証不要」もやりづらい を解決できるかも app\Http\Middleware\AuthenticateForTest.php
<?php namespace App\Http\Middleware; use Closure; use Illuminate\Http\Response; class AuthenticateForTest { /** * 送られてきたリクエストの処理 * * @param \Illuminate\Http\Request $request * @param \Closure $next * @param string|null $guard * @return mixed */ public function handle($request, Closure $next, $guard = null) { if (empty(env('AUTH_FOR_TEST'))) { return $next($request); } $request_user = $request->getUser(); $request_pass = $request->getPassword(); $authentications = explode(',', env('AUTH_FOR_TEST')); foreach ($authentications as $authentication) { if (empty($authentication)) { continue; } list($user, $pass) = explode(':', $authentication); if($request_user == $user && $request_pass = $pass) { return $next($request); } } return new Response('Invalid credentials.', 401, ['WWW-Authenticate' => 'Basic']); } }
app\Http\Kernel.php
protected $routeMiddleware = [ 'auth' => \Illuminate\Auth\Middleware\Authenticate::class, 'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class, 'auth.test' => \App\Http\Middleware\AuthenticateForTest::class, … 追加
routes\web.php (「'middleware' => 'auth.test'」を指定することでミドルウェアを利用できる)
Route::group(['middleware' => 'auth.test'], function () { 〜略〜 }); Route::group(['prefix' => '/admin', 'namespace' => 'Admin', 'as' => 'admin', 'middleware' => 'auth.test'], function () { 〜略〜 });
.env
AUTH_FOR_TEST=guest1:aaaa1234,guest2:bbbb1234
.env に追記した AUTH_FOR_TEST の内容が認証情報 ユーザ名とパスワードを「:」区切りで記載し、「,」区切りで複数指定できる

Advertisement