[0016]htaccessを利用せずLalavelでBasic認証

■l5-very-basic-authを利用

l5-very-basic-authを利用してBasic認証をかける方法です。

この例のLalavelフレームワークのバージョンは5.5です。

LalavelのBasic認証を利用するため、l5-very-basic-authをインストールします。

composerを使ってインストールします。ssh接続し、Lalavelのプロジェクト配下でcomposerコマンドを実行します。

この例ではプロジェクト名が[sample]でプロジェクトがあるディレクトリは/home/failibere/www/sampleです。

              
#Lalavelのプロジェクト配下に移動
% cd /home/failibere/www/sample
#l5-very-basic-authをインストール
% composer require olssonm/l5-very-basic-auth:5.*
              
            

/home/failibere/www/sample/vendor/olssonmが作成されます。

インストール完了です!次に

config/app.phpのサービスプロバイダーに追加します。

app.php

              
'providers' => [
        :
  Olssonm\VeryBasicAuth\VeryBasicAuthServiceProvider::class,
  ],
              
            

次にartisanコマンド実行します。

              
#Lalavelのプロジェクト配下に移動
% cd /home/failibere/www/sample
#very_basic_auth.phpの作成
% php artisan vendor:publish --provider="Olssonm\VeryBasicAuth\VeryBasicAuthServiceProvider"
              
            

/config 配下に very_basic_auth.php が生成されるので編集します。

very_basic_auth.php

              
<?php

    /**
     * Configuration for the "HTTP Very Basic Auth"-middleware
     */
    return [
        // Username
        'user'              => 'XXXX',

        // Password
        'password'          => 'XXXX',

        // Environments where the middleware is active. Use "*" to protect all envs
        'envs'              => [
            '*'
        ],

        // Message to display if the user "opts out"/clicks "cancel"
        'error_message'     => 'You have to supply your credentials to access this resource.',

        // Message to display in the auth dialiog in some browsers (mainly Internet Explorer).
        // Realm is also used to define a "space" that should share credentials.
        'realm'             => 'Basic Auth',

        // If you prefer to use a view with your error message you can uncomment "error_view".
        // This will superseed your default response message
        // 'error_view'        => 'very_basic_auth::default'
    ];

              
            

userとpasswordを任意で設定します。変更が反映されない場合はキャッシュクリアを行います。

サイト全体的にBasic認証をかけるのではなく、個々のURLごとにかけるかかけないか設定したいため、ルートのmiddlewareで設定します。

web.php

              
<?php

//単体で利用
Route::get('list','User\UserController@index')->name('user.index')->middleware('auth.very_basic');

//middlewareにBasic認証とログイン認証両方設定(middleware複数設定)
Route::group(['prefix' => 'mypage','middleware' => ['auth.very_basic','auth:user']], function() {
    Route::get('/', 'HomeController@index')->name('home');
    Route::get('home', 'HomeController@index')->name('home');
});

//middlewareにBasic認証設定(middleware1つのみ設定)
    Route::group(['prefix' => 'admin','middleware' =>'auth.very_basic'], function() {
    Route::get('/',         function () { return redirect('/admin/home'); });
    Route::get('login',     'Admin\LoginController@showLoginForm')->name('admin.login');
    Route::post('login',    'Admin\LoginController@login');
});
              
            

Basic認証が任意のURLのときに設定されるようになりました!

■独自middlewareで実現

l5-very-basic-authを利用せず独自middlewareを作成し、Basic認証をかける方法です。

 

まず、独自middlewareを作成します。名前はなんでもいいいので、「BasicAuthMiddleware」とします。

 
              
#Lalavelのプロジェクト配下に移動
% cd /home/failibere/www/sample
#artisanコマンドで独自middlewareを作成
% php artisan make:middleware BasicAuthMiddleware
              
            

/app/Http/MiddlewareにBasicAuthMiddleware.phpが作成されました。

次に/app/Http/Kernel.phpの$routeMiddleware内に作成したmiddlewareを追加します。

Kernel.php

              
protected $routeMiddleware = [
        'auth' => \App\Http\Middleware\Authenticate::class,
        'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
        'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
        'admin' => \App\Http\Middleware\AdminAuthenticate::class,
        'emergency' => \App\Http\Middleware\EmergencyAuthenticate::class,
        'basicauth' => \App\Http\Middleware\BasicAuthMiddleware::class,
    ];
    		  
            

BasicAuthMiddleware.phpを編集します。

BasicAuthMiddleware.php

              
<?php

namespace App\Http\Middleware;

use Closure;

class BasicAuthMiddleware
{
    /**
     * Handle an incoming request.
     *
     * @param    \Illuminate\Http\Request  $request
     * @param    \Closure  $next
     * @return  mixed
     */
    public function handle($request, Closure $next)
    {
        $username = $request->getUser();
        $password = $request->getPassword();

        if ($username == 'XXXX' && $password == '****') {
            return $next($request);
        }

        header('WWW-Authenticate: Basic realm="plase user and passwoard!"');
        header("HTTP/1.0 401 Unauthorized");
        abort(401);
    }
}
			  
            

「XXXX」の部分に指定したいユーザ名を記述し、「****」の部分に指定したいパスワードを記述します。

Basic認証画面でキャンセルボタンを押した場合は、401ページへ遷移するようにしています。

サイト全体的にBasic認証をかけるのではなく、個々のURLごとにかけるかかけないか設定したいため、ルートのmiddlewareで設定します。

web.php

              
<?php
Route::group(['middleware' => 'basicauth'], function() {

    Route::get('ajax/test', 'AjaxController@test');

});
			  
            

Basic認証が任意のURLのときに設定されるようになりました!

さきほど、/app/Http/Kernel.phpに追加した名前が「basicauth」だったので、'middleware' => 'basicauth'になります。

どちらの方法でも実現できるのでご自身の環境によってどちらか良い方法を選択してください。