メモ > 技術 > フレームワーク: 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 の内容が認証情報
ユーザ名とパスワードを「:」区切りで記載し、「,」区切りで複数指定できる